[ecflow] 02/11: Upstream release 4.7.0

Alastair McKinstry mckinstry at moszumanska.debian.org
Wed Oct 25 11:03:36 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 65cceca4b936fa4b72214d9e718fade25af3ad99
Author: Alastair McKinstry <mckinstry at debian.org>
Date:   Fri Oct 13 12:05:34 2017 +0100

    Upstream release 4.7.0
---
 ACore/ecflow_version.h.in                          |    1 -
 ACore/src/Cal.cpp                                  |    4 +-
 ACore/src/Calendar.cpp                             |   20 +-
 ACore/src/CheckPt.hpp                              |    2 +-
 ACore/src/Child.cpp                                |   13 +
 ACore/src/Child.hpp                                |    8 +-
 ACore/src/Ecf.cpp                                  |    2 +
 ACore/src/Ecf.hpp                                  |   10 +
 ACore/src/EcfPortLock.hpp                          |    8 +-
 ACore/src/File.cpp                                 |   46 +-
 ACore/src/File.hpp                                 |    3 +-
 ACore/src/Indentor.cpp                             |   12 +-
 ACore/src/Indentor.hpp                             |   28 +-
 ACore/src/Stl.hpp                                  |    4 +-
 ACore/src/TimeSlot.cpp                             |   16 +-
 ACore/src/ecflow_version.h                         |    7 +-
 ACore/src/portable_iarchive.hpp                    |    4 +-
 ACore/src/portable_oarchive.hpp                    |    7 +-
 ACore/test/TestArgvCreator.cpp                     |    2 +-
 ACore/test/TestCalendar.cpp                        |   28 +
 ACore/test/TestFile.cpp                            |   92 +
 ACore/test/TestMigration.cpp                       |    4 +-
 ANattr/src/ClockAttr.cpp                           |   68 +-
 ANattr/src/CronAttr.cpp                            |   31 +-
 ANattr/src/DateAttr.cpp                            |   17 +-
 ANattr/src/NodeAttr.cpp                            |   24 +-
 ANattr/src/RepeatAttr.cpp                          |  165 +-
 ANattr/src/RepeatAttr.hpp                          |   24 +-
 ANattr/src/Variable.cpp                            |    9 +
 ANattr/src/Variable.hpp                            |    1 +
 ANattr/src/VerifyAttr.hpp                          |    4 +-
 ANattr/src/ZombieAttr.cpp                          |   20 +-
 ANattr/test/TestAttrSerialization.cpp              |    9 +-
 ANattr/test/TestMigration.cpp                      |    9 +-
 ANattr/test/TestRepeat.cpp                         |  149 +
 ANode/CMakeLists.txt                               |   13 +-
 ANode/jamfile.jam                                  |   10 +-
 {AParser => ANode/parser}/CMakeLists.txt           |   47 +-
 {AParser => ANode/parser}/Jamfile.jam              |   39 +-
 {AParser => ANode/parser}/src/AutoCancelParser.cpp |    0
 {AParser => ANode/parser}/src/AutoCancelParser.hpp |    0
 {AParser => ANode/parser}/src/CalendarParser.cpp   |    0
 {AParser => ANode/parser}/src/CalendarParser.hpp   |    0
 {AParser => ANode/parser}/src/ClockParser.cpp      |   12 +-
 {AParser => ANode/parser}/src/ClockParser.hpp      |    0
 {AParser => ANode/parser}/src/CronParser.cpp       |    0
 {AParser => ANode/parser}/src/CronParser.hpp       |    0
 {AParser => ANode/parser}/src/DateParser.cpp       |    0
 {AParser => ANode/parser}/src/DateParser.hpp       |    0
 {AParser => ANode/parser}/src/DayParser.cpp        |    0
 {AParser => ANode/parser}/src/DayParser.hpp        |    0
 {AParser => ANode/parser}/src/DefsParser.cpp       |  115 +-
 {AParser => ANode/parser}/src/DefsParser.hpp       |    3 +-
 {AParser => ANode/parser}/src/DefsStateParser.cpp  |    0
 {AParser => ANode/parser}/src/DefsStateParser.hpp  |    0
 {AParser => ANode/parser}/src/DefsStatusParser.cpp |    0
 {AParser => ANode/parser}/src/DefsStatusParser.hpp |    0
 .../parser}/src/DefsStructureParser.cpp            |  188 +-
 ANode/parser/src/DefsStructureParser.hpp           |  117 +
 {AParser => ANode/parser}/src/EventParser.cpp      |    0
 {AParser => ANode/parser}/src/EventParser.hpp      |    0
 {AParser => ANode/parser}/src/ExternParser.cpp     |    0
 {AParser => ANode/parser}/src/ExternParser.hpp     |    0
 {AParser => ANode/parser}/src/InlimitParser.cpp    |    0
 {AParser => ANode/parser}/src/InlimitParser.hpp    |    0
 {AParser => ANode/parser}/src/LabelParser.cpp      |    0
 {AParser => ANode/parser}/src/LabelParser.hpp      |    0
 {AParser => ANode/parser}/src/LateParser.cpp       |    0
 {AParser => ANode/parser}/src/LateParser.hpp       |    0
 {AParser => ANode/parser}/src/LimitParser.cpp      |    0
 {AParser => ANode/parser}/src/LimitParser.hpp      |    0
 {AParser => ANode/parser}/src/MeterParser.cpp      |    0
 {AParser => ANode/parser}/src/MeterParser.hpp      |    0
 {AParser => ANode/parser}/src/Parser.cpp           |   11 +-
 {AParser => ANode/parser}/src/Parser.hpp           |    0
 {AParser => ANode/parser}/src/RepeatParser.cpp     |    0
 {AParser => ANode/parser}/src/RepeatParser.hpp     |    0
 {AParser => ANode/parser}/src/TimeParser.cpp       |    0
 {AParser => ANode/parser}/src/TimeParser.hpp       |    0
 {AParser => ANode/parser}/src/TodayParser.cpp      |    0
 {AParser => ANode/parser}/src/TodayParser.hpp      |    0
 {AParser => ANode/parser}/src/TriggerParser.cpp    |    0
 {AParser => ANode/parser}/src/TriggerParser.hpp    |    0
 {AParser => ANode/parser}/src/VariableParser.cpp   |   13 +-
 {AParser => ANode/parser}/src/VariableParser.hpp   |    0
 {AParser => ANode/parser}/src/VerifyParser.cpp     |   15 +-
 {AParser => ANode/parser}/src/VerifyParser.hpp     |    0
 {AParser => ANode/parser}/src/ZombieAttrParser.cpp |    0
 {AParser => ANode/parser}/src/ZombieAttrParser.hpp |    0
 {AParser => ANode/parser}/test/ParseOnly.cpp       |    7 +-
 ANode/parser/test/ParseTimer.cpp                   |  218 +
 {AParser => ANode/parser}/test/PersistHelper.cpp   |  184 +-
 {AParser => ANode/parser}/test/PersistHelper.hpp   |   11 +-
 .../parser}/test/TestAutoAddExterns.cpp            |    6 +-
 .../test/TestDefsStructurePersistAndReload.cpp     |   22 +-
 ANode/parser/test/TestMementoPersistAndReload.cpp  |  405 ++
 {AParser => ANode/parser}/test/TestMigration.cpp   |   42 +-
 {AParser => ANode/parser}/test/TestParser.cpp      |   90 +-
 .../parser}/test/TestSingleDefsFile.cpp            |   17 +-
 .../parser}/test/TestVariableParsing.cpp           |    6 +-
 .../parser}/test/data/bad_defs/clock/clock1.def    |    0
 .../parser}/test/data/bad_defs/clock/clock2.def    |    0
 .../parser}/test/data/bad_defs/clock/clock3.def    |    0
 .../parser}/test/data/bad_defs/clock/clock4.def    |    0
 .../parser}/test/data/bad_defs/clock/clock5.def    |    0
 .../parser}/test/data/bad_defs/clock/clock6.def    |    0
 .../parser}/test/data/bad_defs/clock/clock7.def    |    0
 .../parser}/test/data/bad_defs/cron/cron1.def      |    0
 .../parser}/test/data/bad_defs/cron/cron2.def      |    0
 .../parser}/test/data/bad_defs/cron/cron3.def      |    0
 .../parser}/test/data/bad_defs/cron/cron4.def      |    0
 .../parser}/test/data/bad_defs/cron/cron5.def      |    0
 .../parser}/test/data/bad_defs/cron/cron5_1.def    |    0
 .../parser}/test/data/bad_defs/cron/cron6.def      |    0
 .../parser}/test/data/bad_defs/cron/cron7.def      |    0
 .../parser}/test/data/bad_defs/cron/cron8.def      |    0
 .../test/data/bad_defs/cron/repeat_with_cron.def   |    0
 .../parser}/test/data/bad_defs/date/date.def       |    0
 .../parser}/test/data/bad_defs/date/date0.def      |    0
 .../parser}/test/data/bad_defs/date/date1.def      |    0
 .../parser}/test/data/bad_defs/date/date2.def      |    0
 .../parser}/test/data/bad_defs/date/date3.def      |    0
 .../parser}/test/data/bad_defs/date/date4.def      |    0
 .../parser}/test/data/bad_defs/date/date5.def      |    0
 .../parser}/test/data/bad_defs/day/day.def         |    0
 .../test/data/bad_defs/defstatus/defstatus.def     |    0
 .../parser}/test/data/bad_defs/event/event_1.def   |    0
 .../parser}/test/data/bad_defs/event/event_2.def   |    0
 .../parser}/test/data/bad_defs/event/event_3.def   |    0
 .../parser}/test/data/bad_defs/event/event_4.def   |    0
 .../test/data/bad_defs/event/simple_event.txt      |    0
 .../parser}/test/data/bad_defs/extern/bad.def      |    0
 .../parser}/test/data/bad_defs/extern/complete.def |    0
 .../parser}/test/data/bad_defs/extern/trigger1.def |    0
 .../parser}/test/data/bad_defs/extern/trigger2.def |    0
 .../parser}/test/data/bad_defs/family/family.def   |    0
 .../parser}/test/data/bad_defs/family/family_1.def |    0
 .../test/data/bad_defs/family/simple_family.txt    |    0
 .../parser}/test/data/bad_defs/inlimit/limit.def   |    0
 .../parser}/test/data/bad_defs/inlimit/limt2.def   |    0
 .../parser}/test/data/bad_defs/late/late.def       |    0
 .../parser}/test/data/bad_defs/late/late2.def      |    0
 .../parser}/test/data/bad_defs/late/late3.def      |    0
 .../parser}/test/data/bad_defs/late/late4.def      |    0
 .../parser}/test/data/bad_defs/meter/meter.def     |    0
 .../parser}/test/data/bad_defs/meter/meter2.def    |    0
 .../parser}/test/data/bad_defs/meter/meter3.def    |    0
 .../data/bad_defs/repeat/date_missing_name.def     |    0
 .../bad_defs/repeat/duplicate_repeats_per_node.def |    0
 .../test/data/bad_defs/repeat/invalid_dates.def    |    0
 .../test/data/bad_defs/repeat/invalid_dates_2.def  |    0
 .../test/data/bad_defs/repeat/repeat_date1.def     |    0
 .../test/data/bad_defs/repeat/repeat_date2.def     |    0
 .../test/data/bad_defs/repeat/repeat_date3.def     |    0
 .../test/data/bad_defs/repeat/repeat_integer.def   |    0
 .../test/data/bad_defs/repeat/repeat_month.def     |    0
 .../test/data/bad_defs/repeat/repeat_with_cron.def |    0
 .../test/data/bad_defs/repeat/repeat_year.def      |    0
 .../data/bad_defs/repeat/string_missing_name.def   |    0
 .../parser}/test/data/bad_defs/suite/clock.def     |    0
 .../parser}/test/data/bad_defs/suite/clock1.def    |    0
 .../test/data/bad_defs/suite/simple_suite.txt      |    0
 .../test/data/bad_defs/task/simple_task.txt        |    0
 .../parser}/test/data/bad_defs/task/task.def       |    0
 .../parser}/test/data/bad_defs/task/task_1.def     |    0
 .../parser}/test/data/bad_defs/time/time.def       |    0
 .../parser}/test/data/bad_defs/time/time_1.def     |    0
 .../parser}/test/data/bad_defs/time/time_2.def     |    0
 .../parser}/test/data/bad_defs/time/time_3.def     |    0
 .../parser}/test/data/bad_defs/time/time_4.def     |    0
 .../parser}/test/data/bad_defs/time/time_5.def     |    0
 .../parser}/test/data/bad_defs/time/time_6.def     |    0
 .../parser}/test/data/bad_defs/time/time_7.def     |    0
 .../parser}/test/data/bad_defs/time/time_8.def     |    0
 .../parser}/test/data/bad_defs/today/today.def     |    0
 .../parser}/test/data/bad_defs/today/today1.def    |    0
 .../test/data/bad_defs/trigger/bad_trigger2.txt    |    0
 .../test/data/bad_defs/trigger/bad_trigger3.txt    |    0
 .../test/data/bad_defs/trigger/bad_trigger4.txt    |    0
 .../test/data/bad_defs/trigger/bad_trigger5.txt    |    0
 .../parser}/test/data/bad_defs/trigger/complex.def |    0
 .../test/data/bad_defs/trigger/divide_by_zero.txt  |    0
 .../test/data/bad_defs/trigger/ecflow_969.def      |    0
 .../test/data/bad_defs/trigger/extern_trigger.def  |    0
 .../test/data/bad_defs/trigger/modulo_by_zero.txt  |    0
 .../trigger/simple_trigger_bad_expression.txt      |    0
 .../data/bad_defs/trigger/suite_with_trigger.def   |    0
 .../parser}/test/data/bad_defs/trigger/trigger.txt |    0
 .../test/data/bad_defs/trigger/trigger_1.def       |    0
 .../parser}/test/data/bad_defs/variable/bad.def    |    0
 .../parser}/test/data/bad_defs/variable/bad1.def   |    0
 .../parser}/test/data/bad_defs/variable/bad2.def   |    0
 .../parser}/test/data/bad_defs/variable/bad3.def   |    0
 .../parser}/test/data/bad_defs/variable/bad4.def   |    0
 .../parser}/test/data/bad_defs/variable/bad5.def   |    0
 .../test/data/bad_defs/variable/comment.def        |    0
 .../test/data/bad_defs/variable/comment2.def       |    0
 .../parser}/test/data/bad_defs/verify/verfiy3.def  |    0
 .../parser}/test/data/bad_defs/verify/verify.def   |    0
 .../parser}/test/data/bad_defs/verify/verify2.def  |    0
 .../parser}/test/data/bad_defs/verify/verify4.def  |    0
 .../parser}/test/data/bad_defs/zombie/bad.def      |    0
 .../parser}/test/data/bad_defs/zombie/bad2.def     |    0
 .../parser}/test/data/bad_defs/zombie/bad3.def     |    0
 .../parser}/test/data/bad_defs/zombie/bad4.def     |    0
 .../parser}/test/data/bad_defs/zombie/bad5.def     |    0
 .../parser}/test/data/good_defs/clock/clock.def    |    0
 .../parser}/test/data/good_defs/clock/clock1.def   |    0
 .../parser}/test/data/good_defs/clock/clock2.def   |    0
 .../parser}/test/data/good_defs/clock/clock3.def   |    0
 .../parser}/test/data/good_defs/clock/clock4.def   |    0
 .../parser}/test/data/good_defs/clock/clock5.def   |    0
 .../parser}/test/data/good_defs/clock/clock6.def   |    0
 .../test/data/good_defs/comment/comment.txt        |    0
 .../test/data/good_defs/complete/complete.def      |    0
 .../test/data/good_defs/complete/complex.def       |    0
 .../parser}/test/data/good_defs/cron/cron.def      |    0
 .../parser}/test/data/good_defs/cron/cron1.def     |    0
 .../parser}/test/data/good_defs/cron/cron2.def     |    0
 .../parser}/test/data/good_defs/date/date.def      |    0
 .../parser}/test/data/good_defs/day/day.def        |    0
 .../test/data/good_defs/defstatus/defstatus.txt    |    0
 .../parser}/test/data/good_defs/edit/edit.def      |    0
 .../parser}/test/data/good_defs/event/event_1.def  |    0
 .../parser}/test/data/good_defs/event/event_2.def  |    0
 .../test/data/good_defs/event/family_event.def     |    0
 .../parser}/test/data/good_defs/event/spaces.def   |    0
 .../test/data/good_defs/event/suite_event.def      |    0
 .../parser}/test/data/good_defs/extern/extern.def  |    0
 .../parser}/test/data/good_defs/extern/first.def   |    0
 .../parser}/test/data/good_defs/extern/plain.def   |    0
 .../parser}/test/data/good_defs/extern/second.def  |    0
 .../test/data/good_defs/extern/simple_extern.def   |    0
 .../data/good_defs/family/hierarchical_family.txt  |    0
 .../test/data/good_defs/family/missingEnds.txt     |    0
 .../test/data/good_defs/family/simple_family.txt   |    0
 .../parser}/test/data/good_defs/label/label.txt    |    0
 .../data/good_defs/label/multi_line_lables.def     |    0
 .../parser}/test/data/good_defs/label/spaces.def   |    0
 .../parser}/test/data/good_defs/late/late.def      |    0
 .../parser}/test/data/good_defs/lifecycle.txt      |    0
 .../parser}/test/data/good_defs/limit/limit.def    |   10 +-
 .../parser}/test/data/good_defs/limit/limit2.def   |    0
 .../parser}/test/data/good_defs/limit/limit3.def   |    0
 .../parser}/test/data/good_defs/meter/negative.def |    0
 .../test/data/good_defs/meter/simple_meter.txt     |    0
 .../parser}/test/data/good_defs/meter/spaces.def   |    0
 .../test/data/good_defs/repeat/repeat_date.def     |    0
 .../test/data/good_defs/repeat/repeat_day.def      |    0
 .../good_defs/repeat/repeat_enumerate_quotes.def   |    0
 .../data/good_defs/repeat/repeat_enumerated.def    |    0
 .../test/data/good_defs/repeat/repeat_file.def     |    0
 .../test/data/good_defs/repeat/repeat_integer.def  |    0
 .../data/good_defs/repeat/repeat_integer_1.def     |    0
 .../data/good_defs/repeat/repeat_integer_2.def     |    0
 .../test/data/good_defs/repeat/repeat_string.def   |    0
 .../data/good_defs/repeat/repeat_string_quotes.def |    0
 .../good_defs/suite/multi_statements_per_line.def  |    0
 .../test/data/good_defs/suite/multi_suite.def      |    0
 .../test/data/good_defs/suite/simple_suite.txt     |    0
 .../data/good_defs/suite/suite_with_hierarchy.def  |    0
 .../test/data/good_defs/suite/suite_with_task.def  |    0
 .../test/data/good_defs/task/simple_task.txt       |    0
 .../parser}/test/data/good_defs/task/spaces.def    |    0
 .../parser}/test/data/good_defs/task/task.def      |    0
 .../parser}/test/data/good_defs/time/time.def      |    0
 .../parser}/test/data/good_defs/time/time_1.def    |    0
 .../parser}/test/data/good_defs/time/time_2.def    |    0
 .../parser}/test/data/good_defs/today/today.def    |    0
 .../parser}/test/data/good_defs/today/today1.def   |    0
 .../test/data/good_defs/trigger/ECFLOW_867.def     |    0
 .../good_defs/trigger/all_trigger_examples.def     |   59 +
 .../test/data/good_defs/trigger/anded_ored.def     |    0
 .../test/data/good_defs/trigger/complex_hier.def   |    5 +
 .../data/good_defs/trigger/complex_trigger.txt     |    4 +
 .../test/data/good_defs/trigger/extension.def      |    0
 .../parser}/test/data/good_defs/trigger/late.def   |    0
 .../parser}/test/data/good_defs/trigger/limit.def  |    0
 .../test/data/good_defs/trigger/simple_trigger.txt |    0
 .../data/good_defs/trigger/trigger_references.def  |    0
 .../parser}/test/data/good_defs/variable/alias.def |    0
 .../test/data/good_defs/variable/duplicate.def     |    0
 .../test/data/good_defs/variable/variable.txt      |    0
 .../parser}/test/data/good_defs/verify/verify.def  |    0
 .../parser}/test/data/good_defs/zombie/zombie.def  |    0
 .../test/data/good_defs_state/defs/defs_state.def  |    0
 .../test/data/good_node_defs/family/family.def     |   11 +
 .../test/data/good_node_defs/suite/suite.def       |   17 +
 .../parser/test/data/good_node_defs/task/task.def  |    6 +
 .../parser}/test/data/single_defs/ECFLOW-417.def   |    0
 .../parser}/test/data/single_defs/ealadin.def      |    0
 .../parser}/test/data/single_defs/mega.def         |    0
 .../test/data/single_defs/test_auto_add_extern.def |    0
 .../test/data/single_defs/test_complete.def        |    0
 .../parser}/test/data/single_defs/test_repeat.def  |    0
 ANode/src/Defs.cpp                                 |  226 +-
 ANode/src/Defs.hpp                                 |   32 +-
 ANode/src/EcfFile.hpp                              |    2 +-
 ANode/src/ExprAst.cpp                              |  119 +-
 ANode/src/ExprAst.hpp                              |   47 +
 ANode/src/ExprAstVisitor.cpp                       |   21 +
 ANode/src/ExprAstVisitor.hpp                       |    4 +
 ANode/src/ExprParser.cpp                           |   16 +
 ANode/src/Expression.cpp                           |   25 +
 ANode/src/Expression.hpp                           |   10 +
 ANode/src/InLimit.cpp                              |   12 +-
 ANode/src/InLimitMgr.cpp                           |   40 +-
 ANode/src/Limit.cpp                                |    8 +-
 ANode/src/Node.cpp                                 |   87 +-
 ANode/src/Node.hpp                                 |   12 +-
 ANode/src/NodeChange.cpp                           |   34 +-
 ANode/src/NodeDelete.cpp                           |    2 +-
 ANode/src/ResolveExternsVisitor.hpp                |    1 +
 ANode/src/ServerState.cpp                          |   48 +-
 ANode/src/ServerState.hpp                          |    6 +-
 ANode/src/Submittable.cpp                          |   14 +-
 ANode/src/Submittable.hpp                          |    4 +-
 ANode/src/Suite.cpp                                |   11 +-
 ANode/src/Suite.hpp                                |    1 +
 ANode/src/Task.cpp                                 |   14 +-
 ANode/test/MyDefsFixture.hpp                       |   26 +-
 ANode/test/TestAssignmentOperator.cpp              |   34 +-
 ANode/test/TestCopyConstructor.cpp                 |    3 +-
 ANode/test/TestExprParser.cpp                      |   21 +-
 ANode/test/TestFindAbsNodePath.cpp                 |    3 +-
 ANode/test/TestFlagMigrated.cpp                    |   89 +-
 ANode/test/TestMigration.cpp                       |   73 +-
 ANode/test/TestPersistence.cpp                     |   20 +-
 ANode/test/TestReplace.cpp                         |    9 +-
 ANode/test/TestSingleExprParse.cpp                 |    4 +-
 ANode/test/TestVariableGeneration.cpp              |    9 +
 ANode/test/TestVariableSubstitution.cpp            |   18 +-
 ANode/test/TestZombies.cpp                         |    9 +-
 ANode/test/Test_ECFLOW-247.cpp                     |    2 +-
 .../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 -
 ANode/test/data/migration/fixture/boost.checkpt    |   77 -
 AParser/src/DefsStructureParser.hpp                |   79 -
 AParser/test/ParseTimer.cpp                        |  224 -
 AParser/test/TestJobGenPerf.log                    |    1 -
 Base/CMakeLists.txt                                |    5 +-
 Base/Jamfile.jam                                   |    8 +-
 Base/src/ClientToServerRequest.hpp                 |    2 +
 Base/src/Connection.hpp                            |    4 +-
 Base/src/ServerToClientResponse.hpp                |    2 +
 Base/src/ZombieCtrl.hpp                            |    2 +-
 Base/src/cts/AlterCmd.cpp                          |   72 +-
 Base/src/cts/CFileCmd.cpp                          |   39 +-
 Base/src/cts/ClientToServerCmd.hpp                 |   14 +-
 Base/src/cts/CtsApi.cpp                            |    3 +-
 Base/src/cts/CtsApi.hpp                            |    2 +-
 Base/src/cts/CtsNodeCmd.cpp                        |   36 +-
 Base/src/cts/LoadDefsCmd.cpp                       |   91 +-
 Base/src/cts/PlugCmd.cpp                           |   19 +-
 Base/src/cts/ReplaceNodeCmd.cpp                    |    4 +-
 Base/src/cts/TaskCmds.cpp                          |  126 +-
 Base/src/stc/DefsCache.cpp                         |  107 +
 Base/src/stc/DefsCache.hpp                         |   67 +
 Base/src/stc/ErrorCmd.hpp                          |    5 +-
 Base/src/stc/GroupSTCCmd.cpp                       |    2 +-
 Base/src/stc/SStringCmd.hpp                        |    1 +
 Base/src/stc/SStringVecCmd.hpp                     |    1 +
 Base/src/stc/SSuitesCmd.hpp                        |    1 +
 Base/src/stc/SSyncCmd.cpp                          |  102 +-
 Base/src/stc/SSyncCmd.hpp                          |   52 +-
 Base/src/stc/ServerToClientCmd.hpp                 |    2 +
 Base/src/stc/ZombieGetCmd.hpp                      |    1 +
 Base/test/TestAlterCmd.cpp                         |   32 +-
 Base/test/TestDeleteNodeCmd.cpp                    |    4 +-
 Base/test/TestECFLOW-189.cpp                       |    2 +-
 Base/test/TestForceCmd.cpp                         |   21 +-
 Base/test/TestJobGenPerf.cpp                       |    6 +-
 Base/test/TestJobGenPerf.log                       | 7435 --------------------
 Base/test/TestLoadDefsCmd.cpp                      |   62 +
 Base/test/TestRequest.cpp                          |  366 +-
 Base/test/TestRequeueNodeCmd.cpp                   |    6 +-
 Base/test/TestSSyncCmd.cpp                         |    7 +-
 Base/test/TestSSyncCmdOrder.cpp                    |    6 +-
 Base/test/TestSSyncCmd_CH1.cpp                     |   15 +-
 CMAKE_failed_tests.txt                             |   22 -
 CMakeLists.txt                                     |   32 +-
 CSim/CMakeLists.txt                                |    3 +-
 CSim/jamfile.jam                                   |    8 +-
 CSim/src/AstAnalyserVisitor.cpp                    |    1 +
 CSim/src/AstAnalyserVisitor.hpp                    |    1 +
 CSim/src/Simulator.cpp                             |    8 +-
 CSim/src/Simulator.hpp                             |    4 +
 CSim/test/TestRepeat.cpp                           |    3 -
 CSim/test/TestToday.cpp                            |    2 -
 .../data/test_autoarchive_ast_node_reset.def.log   |   74 +-
 CSim/test/data/test_autoarchive_family.def.log     |   86 +-
 Client/CMakeLists.txt                              |    3 +-
 Client/Jamfile.jam                                 |   11 +-
 Client/src/ClientEnvironment.cpp                   |    2 +
 Client/src/ClientEnvironment.hpp                   |   10 +-
 Client/src/ClientInvoker.cpp                       |   73 +-
 Client/src/ClientInvoker.hpp                       |   21 +-
 Client/test/InvokeServer.hpp                       |    1 -
 Client/test/SCPort.cpp                             |   48 +-
 Client/test/SCPort.hpp                             |    2 +-
 Client/test/TestCheckPtDefsCmd.cpp                 |   86 +-
 Client/test/TestClientInterface.cpp                |   43 +
 Client/test/TestClientTimeout.cpp                  |    2 +-
 Client/test/TestFlagMigrate.cpp                    |    2 +-
 Client/test/TestJobGenOnly.cpp                     |    4 +-
 Client/test/TestLifeCycle.cpp                      |    4 +-
 Client/test/TestLoadDefsCmd.cpp                    |   12 +-
 Client/test/TestPlugCmd.cpp                        |    7 +-
 Client/test/TestServer.cpp                         |    2 +-
 Client/test/TestSinglePerf.cpp                     |   68 +-
 Client/test/TestUrlCmd.cpp                         |    4 +-
 Doc/.pydevproject                                  |    7 -
 Doc/user-manual/client_options.docx                |  Bin 66463 -> 0 bytes
 Doc/user-manual/user_manual.docx                   |  Bin 507282 -> 0 bytes
 Doc/user-manual/user_manual.pdf                    |  Bin 4922737 -> 0 bytes
 Jamroot.jam                                        |    1 -
 Pyext/.pydevproject                                |    7 -
 Pyext/CMakeLists.txt                               |    7 +-
 Pyext/ecflow/__init__.py                           |    4 +-
 Pyext/ecflow/__init__.py.in                        |    2 +-
 Pyext/jamfile.jam                                  |    4 +-
 Pyext/samples/TestBench.py                         |   11 +-
 Pyext/samples/TestGui.py                           |   27 +-
 Pyext/samples/TestJobGenPerf.py                    |    2 +-
 Pyext/setup.py                                     |    4 +-
 Pyext/setup.py.in                                  |    4 +-
 Pyext/src/ClientDoc.cpp                            |   45 +-
 Pyext/src/ClientDoc.hpp                            |    7 +-
 Pyext/src/ExportClient.cpp                         |   14 +-
 Pyext/src/ExportCore.cpp                           |    6 +-
 Pyext/src/ExportDefs.cpp                           |   15 +-
 Pyext/src/ExportNode.cpp                           |    3 +
 Pyext/src/ExportNodeAttr.cpp                       |   42 +-
 Pyext/src/ExportSuiteAndFamily.cpp                 |    7 +-
 Pyext/src/ExportTask.cpp                           |    6 +
 Pyext/test/data/CUSTOMER/ECF_HOME/includes/head.h  |   29 -
 Pyext/test/data/CUSTOMER/ECF_HOME/includes/tail.h  |    3 -
 Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t1.ecf  |   25 -
 Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t2.ecf  |   25 -
 Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t.ecf     |   25 -
 Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t1.ecf    |   26 -
 Pyext/test/data/includes/head.h                    |   11 +-
 Pyext/test/ecflow_test_util.py                     |   80 +-
 Pyext/test/py_s_TestClientApi.py                   |   49 +-
 Pyext/test/py_s_TestPythonChildApi.py              |    4 +-
 Pyext/test/py_u_TestAddDelete.py                   |   10 +-
 Pyext/test/py_u_TestAutoAddExtern.py               |    2 +-
 Pyext/test/py_u_TestGeneratedVariable.py           |    4 +-
 Pyext/test/py_u_TestJobGeneration.py               |    4 +-
 Pyext/test/py_u_TestSimulator.py                   |    2 +-
 Pyext/test/py_u_TestTraversal.py                   |    4 +-
 README                                             |   48 +-
 Server/CMakeLists.txt                              |    3 +-
 Server/Jamfile.jam                                 |    7 +-
 Server/src/CheckPtSaver.cpp                        |   12 +-
 Server/src/Server.cpp                              |   29 +-
 Server/src/ServerEnvironment.hpp                   |    2 +-
 Server/src/ServerOptions.cpp                       |    2 +-
 Server/test/TestServerEnvironment.cpp              |    2 +-
 Test/CMakeLists.txt                                |    3 +-
 Test/Jamfile.jam                                   |    8 +-
 Test/TestAlias.cpp                                 |    3 +-
 Test/TestHandle.cpp                                |    1 -
 Test/TestLate.cpp                                  |    1 -
 Test/TestOrderCmd.cpp                              |    1 -
 Test/TestRepeat.cpp                                |    2 +-
 Test/TestSingle.cpp                                |    8 +-
 Test/TestZombies.cpp                               |   16 +-
 Test/Test_Time.cpp                                 |    4 +-
 Test/src/ServerTestHarness.cpp                     |   13 +-
 Test/src/ServerTestHarness.hpp                     |    2 +
 Test/src/TestFixture.cpp                           |    5 +-
 Test/src/TestFixture.hpp                           |    5 +-
 VERSION.cmake                                      |    6 +-
 Viewer/images/cogwheel_blue.svg                    |   93 +
 Viewer/images/dependency.svg                       |  221 +
 Viewer/images/dependency_detail.svg                |  227 +
 Viewer/images/dock_dependency.svg                  |  221 +
 Viewer/images/expression.svg                       |   92 +
 Viewer/images/menu.svg                             |  138 +
 .../images/{reload_black.svg => reload_green.svg}  |   70 +-
 Viewer/images/reload_one.svg                       |   32 +-
 Viewer/images/search.svg                           |   34 +-
 Viewer/images/trigger_left_arrow.svg               |  107 +
 Viewer/images/trigger_right_arrow.svg              |  109 +
 Viewer/src/AbstractNodeModel.cpp                   |   14 +-
 Viewer/src/AbstractNodeModel.hpp                   |    3 -
 Viewer/src/AbstractNodeView.cpp                    | 1264 ++++
 .../src/{CompactView.hpp => AbstractNodeView.hpp}  |  147 +-
 Viewer/src/ActionHandler.cpp                       |   29 +-
 Viewer/src/ActionHandler.hpp                       |    5 +-
 Viewer/src/Animation.cpp                           |    2 +-
 Viewer/src/AstCollateVNodesVisitor.cpp             |   34 +-
 Viewer/src/AstCollateVNodesVisitor.hpp             |    1 +
 Viewer/src/AttributeEditor.cpp                     |   91 +-
 Viewer/src/AttributeEditor.hpp                     |    1 +
 Viewer/src/AttributeEditorDialog.ui                |    4 +-
 Viewer/src/CMakeLists.txt                          |   45 +-
 Viewer/src/ChangeNotify.cpp                        |   71 +-
 Viewer/src/ChangeNotify.hpp                        |   10 +-
 Viewer/src/ChangeNotifyDialog.cpp                  |   75 +-
 Viewer/src/ChangeNotifyDialog.hpp                  |    1 +
 Viewer/src/ChangeNotifyWidget.cpp                  |   63 +-
 Viewer/src/ChangeNotifyWidget.hpp                  |    5 +-
 Viewer/src/CompactNodeView.cpp                     |  555 --
 Viewer/src/CompactNodeView.hpp                     |  103 -
 Viewer/src/CompactNodeViewDelegate.cpp             |  298 -
 Viewer/src/CompactView.cpp                         | 1258 +---
 Viewer/src/CompactView.hpp                         |  169 +-
 Viewer/src/CustomCommandHandler.cpp                |   16 +-
 Viewer/src/Dashboard.cpp                           |    9 +-
 Viewer/src/DashboardWidget.cpp                     |    6 +-
 Viewer/src/DashboardWidget.hpp                     |    8 +-
 Viewer/src/EditItemWidget.cpp                      |   11 +-
 Viewer/src/EditItemWidget.hpp                      |    5 +-
 Viewer/src/EditItemWidget.ui                       |  101 +-
 Viewer/src/EditorInfoLabel.cpp                     |    2 +-
 Viewer/src/ExpandState.cpp                         |  397 +-
 Viewer/src/ExpandState.hpp                         |   40 +-
 Viewer/src/ExpandStateNode.cpp                     |  208 +-
 Viewer/src/ExpandStateNode.hpp                     |   40 +-
 Viewer/src/FilterWidget.cpp                        |    1 -
 Viewer/src/HistoryItemWidget.cpp                   |   31 +
 Viewer/src/HistoryItemWidget.hpp                   |    7 +-
 Viewer/src/HistoryItemWidget.ui                    |   48 +-
 Viewer/src/IconProvider.cpp                        |    3 +-
 Viewer/src/IconProvider.hpp                        |    3 +-
 Viewer/src/InfoPanel.cpp                           |   41 +-
 Viewer/src/InfoPanel.hpp                           |    8 +-
 Viewer/src/InfoPanelItem.cpp                       |   44 +-
 Viewer/src/InfoPanelItem.hpp                       |   18 +-
 Viewer/src/JobItemWidget.cpp                       |    3 +-
 Viewer/src/LogModel.cpp                            |   42 +-
 Viewer/src/LogModel.hpp                            |    3 +
 Viewer/src/LogProvider.cpp                         |   63 +-
 Viewer/src/LogProvider.hpp                         |   28 +-
 Viewer/src/MainWindow.cpp                          |  210 +-
 Viewer/src/MainWindow.hpp                          |   24 +-
 Viewer/src/MainWindow.ui                           |   64 +-
 Viewer/src/ManualItemWidget.cpp                    |    3 +-
 Viewer/src/MenuHandler.cpp                         |   18 +-
 Viewer/src/MenuHandler.hpp                         |    6 +-
 Viewer/src/MessageItemWidget.cpp                   |   32 +
 Viewer/src/MessageItemWidget.hpp                   |   10 +-
 Viewer/src/MessageItemWidget.ui                    |   38 +-
 Viewer/src/MessageLabel.cpp                        |    4 +-
 Viewer/src/ModelColumn.cpp                         |    1 +
 Viewer/src/NodeExpression.cpp                      |   21 +-
 Viewer/src/NodeExpression.hpp                      |   12 +-
 Viewer/src/NodePanel.cpp                           |   14 +-
 Viewer/src/NodePanel.hpp                           |    3 +-
 Viewer/src/NodePathWidget.cpp                      |   10 +-
 Viewer/src/NodePathWidget.hpp                      |    2 +
 Viewer/src/NodeQueryEditor.cpp                     |    3 +-
 Viewer/src/NodeQueryEngine.cpp                     |    6 +-
 Viewer/src/NodeQueryResult.cpp                     |   11 +-
 Viewer/src/NodeQueryResult.hpp                     |    2 +
 Viewer/src/NodeQueryResultModel.cpp                |    6 +-
 Viewer/src/NodeQueryResultView.cpp                 |    2 +-
 Viewer/src/NodeQueryViewDelegate.cpp               |    5 +-
 Viewer/src/NodeSearchWidget.cpp                    |    7 +-
 Viewer/src/NodeViewBase.hpp                        |    5 +-
 Viewer/src/NodeViewDelegate.cpp                    |  254 +-
 Viewer/src/NodeViewDelegate.hpp                    |   31 +-
 Viewer/src/NodeWidget.hpp                          |    5 -
 Viewer/src/OneLineTextEdit.cpp                     |    3 +-
 Viewer/src/OutputFetchInfo.cpp                     |    8 +-
 Viewer/src/OutputFileClient.cpp                    |    6 +-
 Viewer/src/OutputFileProvider.cpp                  |   21 +-
 Viewer/src/OverviewItemWidget.cpp                  |    3 +-
 Viewer/src/OverviewProvider.cpp                    |    4 +-
 Viewer/src/Palette.cpp                             |    3 +-
 Viewer/src/PlainTextEdit.cpp                       |    6 +-
 Viewer/src/PlainTextSearchInterface.cpp            |    6 +-
 Viewer/src/PropertyDialog.cpp                      |   20 +
 Viewer/src/PropertyDialog.hpp                      |    3 +-
 Viewer/src/PropertyDialog.ui                       |   24 +-
 Viewer/src/PropertyEditor.cpp                      |    1 -
 Viewer/src/PropertyLine.cpp                        |    1 +
 Viewer/src/PropertyMapper.cpp                      |   14 +-
 Viewer/src/PropertyMapper.hpp                      |   11 +-
 Viewer/src/RepeatEditor.cpp                        |   40 +-
 Viewer/src/RepeatEditor.hpp                        |    5 +-
 Viewer/src/RepeatEditorWidget.ui                   |   16 +-
 Viewer/src/RichTextSearchInterface.cpp             |    6 +-
 Viewer/src/ScriptItemWidget.cpp                    |    3 +-
 Viewer/src/ServerComInfoWidget.cpp                 | 1232 ++++
 Viewer/src/ServerComInfoWidget.hpp                 |  205 +
 .../src/{TriggerView.hpp => ServerComObserver.hpp} |   41 +-
 Viewer/src/ServerComQueue.cpp                      |  190 +-
 Viewer/src/ServerComQueue.hpp                      |   10 +-
 Viewer/src/ServerComThread.cpp                     |  526 +-
 Viewer/src/ServerHandler.cpp                       |  276 +-
 Viewer/src/ServerHandler.hpp                       |   22 +-
 Viewer/src/ServerItem.cpp                          |   18 +-
 Viewer/src/ServerList.cpp                          |    3 +-
 Viewer/src/ServerListDialog.cpp                    |    4 +-
 Viewer/src/Sound.cpp                               |    2 +-
 Viewer/src/StandardView.cpp                        |  792 +++
 Viewer/src/StandardView.hpp                        |   63 +
 Viewer/src/SuiteFilter.cpp                         |   23 +-
 Viewer/src/SuiteFilter.hpp                         |    9 +-
 Viewer/src/TableFilterWidget.cpp                   |    3 +-
 Viewer/src/TableNodeModel.cpp                      |   32 -
 Viewer/src/TableNodeModel.hpp                      |    3 -
 Viewer/src/TableNodeView.cpp                       |   22 +-
 Viewer/src/TableNodeView.hpp                       |    6 +-
 Viewer/src/TableNodeViewDelegate.cpp               |    5 +-
 Viewer/src/TableNodeWidget.cpp                     |    4 +-
 Viewer/src/TableNodeWidget.hpp                     |    4 +-
 Viewer/src/TextPager/TextPagerDocument.cpp         |   20 +-
 Viewer/src/TextPager/TextPagerEdit.cpp             |    1 -
 Viewer/src/TextPager/TextPagerSearchInterface.cpp  |    6 +-
 Viewer/src/ToolTipFormat.cpp                       |   50 +
 .../{TriggerTextWidget.hpp => ToolTipFormat.hpp}   |   21 +-
 Viewer/src/TreeNodeModel.cpp                       |   92 +-
 Viewer/src/TreeNodeModel.hpp                       |    7 +-
 Viewer/src/TreeNodeView.cpp                        |  821 ++-
 Viewer/src/TreeNodeView.hpp                        |   89 +-
 Viewer/src/TreeNodeViewDelegate.cpp                | 1465 +++-
 Viewer/src/TreeNodeViewDelegate.hpp                |   89 +-
 Viewer/src/TreeNodeViewDelegateBase.cpp            | 1128 ---
 Viewer/src/TreeNodeViewDelegateBase.hpp            |   94 -
 Viewer/src/TreeNodeWidget.cpp                      |   52 +-
 Viewer/src/TreeNodeWidget.hpp                      |    4 +-
 Viewer/src/TriggerBrowser.cpp                      |  292 -
 Viewer/src/TriggerBrowser.hpp                      |   60 -
 Viewer/src/TriggerBrowser.ui                       |  100 -
 Viewer/src/TriggerCollector.cpp                    |  118 +-
 Viewer/src/TriggerCollector.hpp                    |   82 +
 Viewer/src/TriggerEditor.cpp                       |    3 +-
 Viewer/src/TriggerItemWidget.cpp                   |  268 +-
 Viewer/src/TriggerItemWidget.hpp                   |   18 +-
 Viewer/src/TriggerItemWidget.ui                    |   83 +-
 Viewer/src/TriggerProvider.cpp                     |  274 -
 Viewer/src/TriggerProvider.hpp                     |   47 -
 Viewer/src/TriggerTableModel.cpp                   |  299 +
 Viewer/src/TriggerTableModel.hpp                   |   69 +
 Viewer/src/TriggerTableView.cpp                    |  248 +
 Viewer/src/TriggerTableView.hpp                    |   66 +
 Viewer/src/TriggerTableWidget.cpp                  |  373 +
 Viewer/src/TriggerTableWidget.hpp                  |   73 +
 Viewer/src/TriggerTableWidget.ui                   |  243 +
 Viewer/src/TriggerTextWidget.cpp                   |   42 +
 Viewer/src/TriggerTextWidget.hpp                   |    6 +
 Viewer/src/TriggerView.cpp                         |  516 --
 Viewer/src/TriggerViewDelegate.cpp                 |  176 +
 ...odeViewDelegate.hpp => TriggerViewDelegate.hpp} |   38 +-
 Viewer/src/UIDebug.hpp                             |    8 +-
 Viewer/src/UiLog.cpp                               |   52 +
 Viewer/src/UiLog.hpp                               |   21 +-
 Viewer/src/VAttribute.cpp                          |   12 +-
 Viewer/src/VAttribute.hpp                          |    1 +
 Viewer/src/VAttributeType.cpp                      |    2 +-
 Viewer/src/VConfig.cpp                             |    4 +-
 Viewer/src/VDateAttr.cpp                           |   16 +-
 Viewer/src/VDir.cpp                                |    2 +-
 Viewer/src/VEventAttr.cpp                          |    4 +-
 Viewer/src/VFilter.cpp                             |   18 +-
 Viewer/src/VGenVarAttr.cpp                         |   21 +-
 Viewer/src/VGenVarAttr.hpp                         |    2 +-
 Viewer/src/VInfo.cpp                               |   53 +-
 Viewer/src/VInfo.hpp                               |    7 +-
 Viewer/src/VItem.hpp                               |    1 +
 Viewer/src/VItemPathParser.cpp                     |   22 +
 Viewer/src/VItemPathParser.hpp                     |    3 +-
 Viewer/src/VLabelAttr.cpp                          |    7 +-
 Viewer/src/VLimitAttr.cpp                          |    4 +-
 Viewer/src/VLimiterAttr.cpp                        |    4 +-
 Viewer/src/VMeterAttr.cpp                          |    4 +-
 Viewer/src/VModelData.cpp                          |  274 +-
 Viewer/src/VModelData.hpp                          |   12 +-
 Viewer/src/VNode.cpp                               |  188 +-
 Viewer/src/VNode.hpp                               |    7 +-
 Viewer/src/VNodeList.cpp                           |    2 +-
 Viewer/src/VProperty.cpp                           |   85 +-
 Viewer/src/VProperty.hpp                           |    6 +-
 Viewer/src/VRepeatAttr.cpp                         |  104 +-
 Viewer/src/VRepeatAttr.hpp                         |   11 +-
 Viewer/src/VServerSettings.cpp                     |   11 +
 Viewer/src/VServerSettings.hpp                     |    5 +-
 Viewer/src/VTaskObserver.hpp                       |    2 +-
 Viewer/src/VTimeAttr.cpp                           |   24 +-
 Viewer/src/VTree.cpp                               |   23 +-
 Viewer/src/VTree.hpp                               |    2 +-
 Viewer/src/VUserVarAttr.cpp                        |   18 +-
 .../src/{TriggerEditor.cpp => VariableEditor.cpp}  |  111 +-
 Viewer/src/VariableEditor.hpp                      |   50 +
 Viewer/src/VariableEditorWidget.ui                 |   64 +
 Viewer/src/VariableItemWidget.cpp                  |  183 +-
 Viewer/src/VariableItemWidget.hpp                  |    4 +-
 Viewer/src/VariableItemWidget.ui                   |   15 +-
 Viewer/src/VariableModel.cpp                       |  216 +-
 Viewer/src/VariableModel.hpp                       |   14 +-
 Viewer/src/VariableModelData.cpp                   |  244 +-
 Viewer/src/VariableModelData.hpp                   |   20 +-
 Viewer/src/VariableView.cpp                        |    3 +
 Viewer/src/ViewerMain.cpp                          |    4 +-
 Viewer/src/WhyItemWidget.cpp                       |   59 +-
 Viewer/src/WhyItemWidget.hpp                       |    4 +-
 Viewer/src/ZombieItemWidget.cpp                    |   45 +-
 Viewer/src/ZombieItemWidget.hpp                    |    7 +-
 Viewer/src/ZombieItemWidget.ui                     |   31 +-
 Viewer/src/ZombieModel.cpp                         |    4 +-
 Viewer/src/viewer.qrc                              |   14 +-
 bin/ecbuild                                        |  438 --
 build_scripts/.pydevproject                        |    7 -
 build_scripts/boost_build.sh                       |   56 +-
 build_scripts/clean.sh                             |    5 +-
 build_scripts/massif.sh                            |    4 +-
 build_scripts/profile.sh                           |   20 +-
 build_scripts/rmbin.sh                             |    4 +-
 build_scripts/tar_ecflow.sh                        |    2 +-
 build_scripts/test.sh                              |   12 +-
 build_scripts/val.sh                               |    2 +-
 cmake.sh                                           |   62 +-
 cmake/FindAIO.cmake                                |   52 +-
 cmake/FindGd.cmake                                 |   59 +
 cmake/FindNAG.cmake                                |   43 +
 cmake/FindPangoCairo.cmake                         |   25 +-
 cmake/VERSION.cmake                                |    8 +-
 cmake/compiler_flags/Clang_C.cmake                 |    2 +-
 cmake/compiler_flags/Clang_CXX.cmake               |    2 +-
 cmake/compiler_flags/GNU_Fortran.cmake             |    2 +
 cmake/compiler_flags/Intel_Fortran.cmake           |   16 +-
 cmake/contrib/FindNetCDF4.cmake                    |    4 +-
 .../contrib/GreatCMakeCookOff/AddCPP11Flags.cmake  |   48 +-
 .../GreatCMakeCookOff/CheckCXX11Features.cmake     |    4 +-
 cmake/ecbuild-config-version.cmake                 |    2 +-
 cmake/ecbuild-config.cmake                         |    8 +-
 cmake/ecbuild_add_executable.cmake                 |   35 +-
 cmake/ecbuild_add_library.cmake                    |   89 +-
 cmake/ecbuild_add_persistent.cmake                 |    4 +-
 cmake/ecbuild_add_resources.cmake                  |    7 +
 cmake/ecbuild_add_test.cmake                       |   69 +-
 cmake/ecbuild_append_to_rpath.cmake                |   15 +-
 cmake/ecbuild_bundle.cmake                         |   10 +-
 cmake/ecbuild_check_c_source_return.cmake          |   14 +-
 cmake/ecbuild_check_compiler.cmake                 |    4 +
 cmake/ecbuild_check_cxx11.cmake                    |    2 +-
 cmake/ecbuild_check_cxx_source_return.cmake        |   10 +-
 cmake/ecbuild_check_fortran_source_return.cmake    |    6 +-
 cmake/ecbuild_check_functions.cmake                |    5 +
 cmake/ecbuild_check_os.cmake                       |  172 +-
 cmake/ecbuild_compiler_flags.cmake                 |   16 +-
 cmake/ecbuild_config.h.in                          |    3 +
 cmake/ecbuild_declare_project.cmake                |   22 +-
 cmake/ecbuild_define_options.cmake                 |    6 +
 cmake/ecbuild_define_paths.cmake                   |   19 +-
 cmake/ecbuild_find_fortranlibs.cmake               |    4 +-
 cmake/ecbuild_find_omp.cmake                       |    6 +-
 cmake/ecbuild_find_package.cmake                   |   10 +-
 cmake/ecbuild_generate_rpc.cmake                   |   88 +-
 cmake/ecbuild_get_test_data.cmake                  |    9 +-
 cmake/ecbuild_git.cmake                            |    6 +-
 cmake/ecbuild_install_project.cmake                |    2 +
 cmake/ecbuild_log.cmake                            |    2 +-
 cmake/ecbuild_pkgconfig.cmake                      |    2 +-
 cmake/ecbuild_policies.cmake                       |   10 +-
 cmake/ecbuild_remove_fortran_flags.cmake           |    6 +-
 cmake/ecbuild_setup_test_framework.cmake           |   29 +-
 cmake/ecbuild_system.cmake                         |   16 +-
 cmake/ecbuild_try_run.cmake                        |  200 +
 cmake/ecbuild_uninstall.cmake.in                   |   15 +-
 cmake/ecbuild_use_package.cmake                    |   58 +-
 cmake/fortran_features/CheckFortranFeatures.cmake  |    4 +-
 cmake/project-config.cmake.in                      |    2 +-
 cmake/sg.pl                                        |    5 +-
 install.sh                                         |    2 +-
 share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake     |  105 +-
 share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake      |   93 +
 share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake    |   93 +
 share/ecflow/etc/CMakeLists.txt                    |    1 +
 share/ecflow/etc/ecflowview_gui.json               |  168 +-
 share/ecflow/etc/ecflowview_gui_server.json        |    6 +-
 share/ecflow/etc/ecflowview_menu_conf.json         |   64 +
 share/ecflow/etc/ecflowview_menus.json             |   55 +-
 share/ecflow/etc/ecflowview_notification_conf.json |   36 +-
 share/ecflow/etc/ecflowview_panels.json            |    2 +-
 share/ecflow/etc/ecflowview_server_conf.json       |   37 +-
 share/ecflow/etc/ecflowview_view_conf.json         |   15 +-
 share/ecflow/etc/viewer.qss                        |   62 +-
 view/CMakeLists.txt                                |    3 +-
 view/Jamfile.jam                                   |    6 +-
 view/src/Hyper.c                                   |   26 +-
 view/src/HyperP.h                                  |    3 -
 view/src/ecflowview.menu                           |    4 +-
 view/src/output.cc                                 |    1 -
 view/src/selection.cc                              |    4 +-
 view/src/simple_node.cc                            |   28 +-
 view/src/variables.cc                              |   14 +-
 794 files changed, 19164 insertions(+), 18538 deletions(-)

diff --git a/ACore/ecflow_version.h.in b/ACore/ecflow_version.h.in
index 083f6a4..302f8cf 100644
--- a/ACore/ecflow_version.h.in
+++ b/ACore/ecflow_version.h.in
@@ -2,7 +2,6 @@
 #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@"
diff --git a/ACore/src/Cal.cpp b/ACore/src/Cal.cpp
index cc55f87..adeb50e 100644
--- a/ACore/src/Cal.cpp
+++ b/ACore/src/Cal.cpp
@@ -15,7 +15,7 @@
 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
 
 #include "Cal.hpp"
-
+#include <stdio.h>
 long Cal::julian_to_date(long jdate)
 {
    long x,y,d,m,e;
@@ -77,3 +77,5 @@ long Cal::date_to_julian(long ddate)
 
    return(j1);
 }
+
+// int main(int ac, char** av){ int a=Cal::date_to_julian(20170219) % 7; printf("%d", a); return 0;}
diff --git a/ACore/src/Calendar.cpp b/ACore/src/Calendar.cpp
index 4575d05..def9203 100644
--- a/ACore/src/Calendar.cpp
+++ b/ACore/src/Calendar.cpp
@@ -311,16 +311,16 @@ std::string Calendar::write_state() const
    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();
+   std::string ret;
+   ret += " initTime:";      ret += to_simple_string(initTime_);
+   ret += " suiteTime:";     ret += to_simple_string(suiteTime_);
+   ret += " duration:";      ret += to_simple_string(duration_);
+   ret += " initLocalTime:"; ret += to_simple_string(initLocalTime_);
+   ret += " lastTime:";      ret += to_simple_string(lastTime_);
+   if (calendarIncrement__changed) { ret += " calendarIncrement:"; ret += to_simple_string(calendarIncrement_); }
+
+   if (dayChanged_) ret += " dayChanged:1" ;
+   return ret;
 }
 
 void Calendar::read_state(const std::string& line,const std::vector<std::string>& lineTokens)
diff --git a/ACore/src/CheckPt.hpp b/ACore/src/CheckPt.hpp
index 8772a91..6a93dac 100644
--- a/ACore/src/CheckPt.hpp
+++ b/ACore/src/CheckPt.hpp
@@ -32,7 +32,7 @@ public:
    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;}
+   static int default_save_time_alarm() { return 20;}
 
 private:
    CheckPt();
diff --git a/ACore/src/Child.cpp b/ACore/src/Child.cpp
index 2b89a69..ddb7a76 100644
--- a/ACore/src/Child.cpp
+++ b/ACore/src/Child.cpp
@@ -126,6 +126,19 @@ bool Child::valid_child_cmd( const std::string& s)
  	return false;
 }
 
+std::vector<Child::CmdType> Child::list()
+{
+   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);
+   return child_cmds;
+}
+
 //=====================================================================
 
 bool User::valid_user_action( const std::string& s)
diff --git a/ACore/src/Child.hpp b/ACore/src/Child.hpp
index b9e90f0..1ee84ac 100644
--- a/ACore/src/Child.hpp
+++ b/ACore/src/Child.hpp
@@ -25,7 +25,11 @@ class Child : private boost::noncopyable {
 public:
 	enum CmdType    { INIT, EVENT, METER, LABEL, WAIT, ABORT, COMPLETE };
 
-	enum ZombieType { USER, ECF, PATH , NOT_SET };
+	enum ZombieType {
+	   USER,
+	   ECF,
+	   PATH ,
+	   NOT_SET };
 
 	static std::string to_string(ZombieType);
 	static bool valid_zombie_type( const std::string& );
@@ -40,6 +44,8 @@ public:
 	static bool valid_child_cmds( const std::string& );
 	static bool valid_child_cmd( const std::string& );
 
+   static std::vector<Child::CmdType> list();
+
 private:
 	Child();
 };
diff --git a/ACore/src/Ecf.cpp b/ACore/src/Ecf.cpp
index 7f308ac..2d438dc 100644
--- a/ACore/src/Ecf.cpp
+++ b/ACore/src/Ecf.cpp
@@ -20,6 +20,8 @@ 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;
+bool DebugEquality::ignore_server_variables_ = false;
+
 
 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;}
diff --git a/ACore/src/Ecf.hpp b/ACore/src/Ecf.hpp
index f7f4257..c95f1c0 100644
--- a/ACore/src/Ecf.hpp
+++ b/ACore/src/Ecf.hpp
@@ -89,4 +89,14 @@ private:
 	unsigned int state_change_no_;
 	unsigned int modify_change_no_;
 };
+
+class DebugEquality : private boost::noncopyable {
+public:
+   DebugEquality() { Ecf::set_debug_equality(true); }
+   ~DebugEquality(){ Ecf::set_debug_equality(false); set_ignore_server_variables(false);}
+   static bool ignore_server_variables() { return ignore_server_variables_;}
+   static void set_ignore_server_variables(bool flg) { ignore_server_variables_ = flg;}
+private:
+   static bool ignore_server_variables_;
+};
 #endif
diff --git a/ACore/src/EcfPortLock.hpp b/ACore/src/EcfPortLock.hpp
index bb4bb34..2f7fe54 100644
--- a/ACore/src/EcfPortLock.hpp
+++ b/ACore/src/EcfPortLock.hpp
@@ -31,14 +31,14 @@ namespace ecf {
 class EcfPortLock : private boost::noncopyable {
 public:
 
-   static bool is_free(int port)
+   static bool is_free(int port, bool debug = false)
    {
       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 ";
+         if (debug) std::cout << "  EcfPortLock::is_free(" << port << ") returning FALSE\n ";
          return false;
       }
-   //   std::cout << "EcfPortLock::is_free returning TRUE\n ";
+      if (debug) std::cout << "  EcfPortLock::is_free(" << port << ") returning TRUE\n ";
       return true;
    }
 
@@ -71,7 +71,7 @@ private:
       char* ecf_port_lock_dir = getenv("ECF_PORT_LOCK_DIR");
       std::string path;
       if (ecf_port_lock_dir) path = ecf_port_lock_dir;
-      else                   path = File::root_build_dir();
+      else                   path = File::root_source_dir();
 
       path += "/ECF_PORT_used_";
       path += the_port;
diff --git a/ACore/src/File.cpp b/ACore/src/File.cpp
index d24a10f..340767e 100644
--- a/ACore/src/File.cpp
+++ b/ACore/src/File.cpp
@@ -151,12 +151,12 @@ bool File::splitFileIntoLines(const std::string& filename, std::vector<std::stri
 	// 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;
+	return true;
 }
 
-
-std::string File::get_last_n_lines(const std::string& filename,int last_n_lines, std::string& error_msg)
+std::string File::get_last_n_lines(const std::string& filename,int last_n_lines, size_t& file_size,std::string& error_msg)
 {
+   file_size = 0;
    if ( last_n_lines <= 0  ) return string();
 
    std::ifstream source( filename.c_str(), std::ios_base::in );
@@ -165,32 +165,28 @@ std::string File::get_last_n_lines(const std::string& filename,int last_n_lines,
       error_msg += " (";
       error_msg += strerror(errno);
       error_msg += ")";
-     return string();
+      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() );
+   file_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 );
-#if defined(HPUX) || defined(_AIX)
-       source.read( &(buffer.front()), buffer.size() );
-#else
-       source.read( buffer.data(), buffer.size() );
-#endif
-       newlineCount = std::count( buffer.begin(), buffer.end(), '\n');
+            && buffer.size() != file_size
+            && newlineCount < last_n_lines )
+   {
+      buffer.resize( std::min( buffer.size() + granularity, file_size ) );
+      source.seekg( -static_cast<std::streamoff>( buffer.size() ), std::ios_base::end );
+      source.read( &(buffer.front()), 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;
+      start = std::find( start, buffer.end(), '\n' ) + 1;
+      -- newlineCount;
    }
 
    //std::vector<char>::iterator end = remove( start, buffer.end(), '\r' ); // for windows
@@ -198,6 +194,13 @@ std::string File::get_last_n_lines(const std::string& filename,int last_n_lines,
 }
 
 
+std::string File::get_last_n_lines(const std::string& filename,int last_n_lines, std::string& error_msg)
+{
+   size_t file_size = 0;
+   return File::get_last_n_lines(filename,last_n_lines,file_size,error_msg);
+}
+
+
 std::string File::get_first_n_lines(const std::string& filename,int n_lines, std::string& error_msg)
 {
    if ( n_lines <= 0  ) return string();
@@ -937,6 +940,10 @@ std::string File::root_source_dir()
 
 std::string File::root_build_dir()
 {
+#ifdef CMAKE
+   return CMAKE_ECFLOW_BUILD_DIR;
+#endif
+
    fs::path current_path = fs::current_path();
    std::string the_current_path = current_path.string();
 
@@ -948,7 +955,6 @@ std::string File::root_build_dir()
    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;
@@ -963,7 +969,7 @@ std::string File::root_build_dir()
 
       // cmake
       std::string cmake_cache = the_current_path + "/CMakeCache.txt";
-      if (fs::exists(cmake_cache))  return the_current_path;
+      if (fs::exists(cmake_cache)) return the_current_path;
 
       stem = current_path.stem().string();
       count++;
diff --git a/ACore/src/File.hpp b/ACore/src/File.hpp
index 60af4e5..188cabe 100644
--- a/ACore/src/File.hpp
+++ b/ACore/src/File.hpp
@@ -53,7 +53,8 @@ public:
 	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);
+   static std::string get_last_n_lines(const std::string& filename,int last_n_lines, std::string& error_msg);
+   static std::string get_last_n_lines(const std::string& filename,int last_n_lines, size_t& file_size,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);
diff --git a/ACore/src/Indentor.cpp b/ACore/src/Indentor.cpp
index f9302d8..f759034 100644
--- a/ACore/src/Indentor.cpp
+++ b/ACore/src/Indentor.cpp
@@ -18,14 +18,16 @@
 namespace ecf {
 
 int Indentor::index_ = 0;
-
+bool Indentor::indent_ = true;
 
 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;
+   if (indent_) {
+      int spaces = index_ * char_spaces;
+      for (int i = 0; i != spaces; i++)
+         os << " ";
+   }
+   return os;
 }
 
 }
diff --git a/ACore/src/Indentor.hpp b/ACore/src/Indentor.hpp
index c5c7562..500e074 100644
--- a/ACore/src/Indentor.hpp
+++ b/ACore/src/Indentor.hpp
@@ -20,17 +20,29 @@ namespace ecf {
 
 class Indentor {
 public:
-	Indentor() {
-		++index_;
-	}
-	~Indentor() {
-		--index_;
-	}
+   Indentor() {
+      ++index_;
+   }
+   ~Indentor() {
+      --index_;
+   }
 
-	static std::ostream& indent( std::ostream& os , int char_spaces = 2);
+   static std::ostream& indent( std::ostream& os , int char_spaces = 2);
 
 private:
-	static int index_;
+   static int index_;
+
+private:
+   friend class DisableIndentor;
+   static void disable_indent() { indent_ = false;}
+   static void enable_indent()  { indent_ = true;}
+   static bool indent_;
+};
+
+class DisableIndentor {
+public:
+   DisableIndentor() { Indentor::disable_indent(); }
+   ~DisableIndentor() { Indentor::enable_indent();}
 };
 
 }
diff --git a/ACore/src/Stl.hpp b/ACore/src/Stl.hpp
index 7b61b8c..befdebd 100644
--- a/ACore/src/Stl.hpp
+++ b/ACore/src/Stl.hpp
@@ -26,7 +26,7 @@ namespace ecf
 {
 	/// Helper struct that will aid the deletion of Pointer from a container
 	template <typename T> struct TSeqDeletor {
-		void operator () (T pointer) {
+		void operator ()(T pointer) const {
 			// std::cout << "Destroy of this pointer" << std::endl;
 			delete pointer;
 			pointer = 0;
@@ -48,7 +48,7 @@ namespace ecf
 
 	/// Helper struct that will aid the deletion of Pointer from a Associative container
 	template <typename TPair> struct TAsoDeletor {
-    	void operator () (TPair& tElem)  {
+    	void operator () (TPair& tElem) const {
     		if(tElem.second) {
         		delete tElem.second;
     		}
diff --git a/ACore/src/TimeSlot.cpp b/ACore/src/TimeSlot.cpp
index efbc030..ce0bff6 100644
--- a/ACore/src/TimeSlot.cpp
+++ b/ACore/src/TimeSlot.cpp
@@ -63,14 +63,14 @@ std::ostream& TimeSlot::print(std::ostream& os) const
 
 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();
+   std::string ret;
+	if (hour_ < 10)  ret += "0";
+	ret += boost::lexical_cast<std::string>(hour_);
+
+	ret += Str::COLON();
+	if (minute_ < 10) ret += "0";
+	ret += boost::lexical_cast<std::string>(minute_);
+	return ret;
 }
 
 boost::posix_time::time_duration TimeSlot::duration() const
diff --git a/ACore/src/ecflow_version.h b/ACore/src/ecflow_version.h
index a36ec36..d65af49 100644
--- a/ACore/src/ecflow_version.h
+++ b/ACore/src/ecflow_version.h
@@ -1,10 +1,9 @@
 #ifndef ecflow_version_config_h
 #define ecflow_version_config_h
  
-#define ECFLOW_VERSION   "4.6.1"
-
+#define ECFLOW_VERSION   "4.7.0"
 #define ECFLOW_RELEASE   "4"
-#define ECFLOW_MAJOR     "6"
-#define ECFLOW_MINOR     "1"
+#define ECFLOW_MAJOR     "7"
+#define ECFLOW_MINOR     "0"
 
 #endif 
diff --git a/ACore/src/portable_iarchive.hpp b/ACore/src/portable_iarchive.hpp
index 28c33de..b4041a6 100644
--- a/ACore/src/portable_iarchive.hpp
+++ b/ACore/src/portable_iarchive.hpp
@@ -63,7 +63,7 @@
  *       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.
+ *       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
@@ -400,7 +400,7 @@ namespace eos {
 			traits::set_bits(t, bits);
 
 			// if the no_infnan flag is set we must throw here
-			if (get_flags() & no_infnan && !fp::isfinite(t))
+			if ((get_flags() & no_infnan) && !fp::isfinite(t))
 				throw portable_archive_exception(t);
 
 			// if you end here your floating point type does not support 
diff --git a/ACore/src/portable_oarchive.hpp b/ACore/src/portable_oarchive.hpp
index e3403dd..1679c75 100644
--- a/ACore/src/portable_oarchive.hpp
+++ b/ACore/src/portable_oarchive.hpp
@@ -66,7 +66,7 @@
  *       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.
+ *       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
@@ -371,7 +371,7 @@ namespace eos {
 			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))
+			if ((get_flags() & no_infnan) && !fp::isfinite(t))
 				throw portable_archive_exception(t);
 
 			// if you end here there are three possibilities:
@@ -391,7 +391,8 @@ namespace eos {
 			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
+			/* no break */
+			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);
 			}
diff --git a/ACore/test/TestArgvCreator.cpp b/ACore/test/TestArgvCreator.cpp
index 97edd67..3fbee0d 100644
--- a/ACore/test/TestArgvCreator.cpp
+++ b/ACore/test/TestArgvCreator.cpp
@@ -10,7 +10,7 @@
 // granted to it by virtue of its status as an intergovernmental organisation 
 // nor does it submit to any jurisdiction. 
 //
-// Description :
+// Description
 //============================================================================
 #include <boost/test/unit_test.hpp>
 #include <boost/lexical_cast.hpp>
diff --git a/ACore/test/TestCalendar.cpp b/ACore/test/TestCalendar.cpp
index 3414294..b56a8b5 100644
--- a/ACore/test/TestCalendar.cpp
+++ b/ACore/test/TestCalendar.cpp
@@ -22,6 +22,7 @@
 #include "Calendar.hpp"
 #include "TimeSeries.hpp"
 #include "Str.hpp"
+#include "Cal.hpp"
 
 using namespace std;
 using namespace ecf;
@@ -499,4 +500,31 @@ BOOST_AUTO_TEST_CASE( test_day_changed_for_hybrid )
 	}
 }
 
+BOOST_AUTO_TEST_CASE( test_calendar_julian )
+{
+   cout << "ACore:: ...test_calendar_julian\n";
+
+   Calendar calendar;
+   calendar.init(ptime(date(2017,1,1), minutes(0)), Calendar::REAL);
+   BOOST_CHECK_MESSAGE(!calendar.hybrid(),"calendar type should be real");
+
+   int days = 0;
+   while( calendar.year() != 2018 ) {
+
+      boost::gregorian::date cal_date = calendar.date();
+      long boost_julian = cal_date.julian_day();
+
+      std::string iso_string = to_iso_string(cal_date);
+      long date_as_long = boost::lexical_cast<long>(iso_string);
+      long ecmwf_julian = Cal::date_to_julian(date_as_long);
+
+      BOOST_CHECK_MESSAGE(boost_julian == ecmwf_julian,"boost julian " << boost_julian << " != ecmwf julian " << ecmwf_julian << " for "  << iso_string);
+
+      // Update calendar every day for a year
+      calendar.update( time_duration( hours(24) ) );
+      days++;
+   }
+   BOOST_CHECK_MESSAGE(days == 365,"expected 365 days but found " << days);
+}
+
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/ACore/test/TestFile.cpp b/ACore/test/TestFile.cpp
index ebc0e96..b7832e4 100644
--- a/ACore/test/TestFile.cpp
+++ b/ACore/test/TestFile.cpp
@@ -309,4 +309,96 @@ BOOST_AUTO_TEST_CASE( test_create_missing_directories )
    }
 }
 
+BOOST_AUTO_TEST_CASE( test_get_last_lines_of_a_file )
+{
+   cout << "ACore:: ...test_get_last_lines_of_a_file\n";
+
+   std::string path = File::test_data("ACore/test/data/test_get_last_lines_of_a_file.txt","ACore");
+   std::string last_100_lines;
+   size_t no_of_lines = 100;
+   { // create file with 100 lines 0-99
+      std::stringstream ss;
+      std::ofstream file( path.c_str() );
+      for(size_t i=0; i < no_of_lines; i++) {
+         file << i << ": the line\n";
+         ss << i << ": the line\n";
+      }
+      last_100_lines = ss.str();
+   }
+   { // get negative lines
+       std::string error_msg;
+       std::string last_lines = File::get_last_n_lines(path,-1,error_msg);
+       BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+       BOOST_REQUIRE_MESSAGE(last_lines == "" ,"Expected '' but found " <<  last_lines );
+    }
+   { // get no lines
+      std::string error_msg;
+      std::string last_lines = File::get_last_n_lines(path,0,error_msg);
+      BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+      BOOST_REQUIRE_MESSAGE(last_lines == "" ,"Expected '' but found " <<  last_lines );
+   }
+   { // get the last line only
+      std::string error_msg;
+      std::string last_lines = File::get_last_n_lines(path,1,error_msg);
+      BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+      BOOST_REQUIRE_MESSAGE(last_lines == "99: the line\n" ,"Expected '99: the line\n' but found " <<  last_lines );
+   }
+   { // get the last 2 line only
+      std::string error_msg;
+      std::string last_lines = File::get_last_n_lines(path,2,error_msg);
+      BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+      BOOST_REQUIRE_MESSAGE(last_lines == "98: the line\n99: the line\n" ,"Expected last 2 lines but got " <<  last_lines );
+   }
+   { // get the last 100 line only
+      std::string error_msg;
+      std::string last_lines = File::get_last_n_lines(path,no_of_lines,error_msg);
+      BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+      BOOST_REQUIRE_MESSAGE(last_lines == last_100_lines,"Expected last " << no_of_lines << " lines but got " <<  last_lines );
+   }
+   { // get the last 1000 line only
+      std::string error_msg;
+      std::string last_lines = File::get_last_n_lines(path,1000,error_msg);
+      BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+      BOOST_REQUIRE_MESSAGE(last_lines == last_100_lines,"Expected last " << no_of_lines << " lines but got " <<  last_lines );
+   }
+
+   fs::remove(path); // Remove the file. Comment out for debugging
+
+
+   // ===================================================================================
+   // Now check empty file
+   // ===================================================================================
+   {
+      std::ofstream file( path.c_str() ); // create empty file
+      BOOST_REQUIRE_MESSAGE(file.good(),"failed");
+   }
+
+   { // get no lines ?
+      std::string error_msg;
+      std::string last_lines = File::get_last_n_lines(path,0,error_msg);
+      BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+      BOOST_REQUIRE_MESSAGE(last_lines == "" ,"Expected '' but found " <<  last_lines );
+   }
+   { // get the last line only
+      std::string error_msg;
+      std::string last_lines = File::get_last_n_lines(path,1,error_msg);
+      BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+      BOOST_REQUIRE_MESSAGE(last_lines == "" ,"Expected '' but found " <<  last_lines );
+   }
+   { // get the last 2 line only
+      std::string error_msg;
+      std::string last_lines = File::get_last_n_lines(path,2,error_msg);
+      BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+      BOOST_REQUIRE_MESSAGE(last_lines == "" ,"Expected '' but found " <<  last_lines );
+   }
+   { // get the last 100 line only
+      std::string error_msg;
+      std::string last_lines = File::get_last_n_lines(path,no_of_lines,error_msg);
+      BOOST_REQUIRE_MESSAGE(error_msg.empty(),"Expected no failure but got " << error_msg );
+      BOOST_REQUIRE_MESSAGE(last_lines == "" ,"Expected '' but found " <<  last_lines );
+   }
+
+   fs::remove(path); // Remove the file. Comment out for debugging
+}
+
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/ACore/test/TestMigration.cpp b/ACore/test/TestMigration.cpp
index cd91db9..77bab91 100644
--- a/ACore/test/TestMigration.cpp
+++ b/ACore/test/TestMigration.cpp
@@ -48,7 +48,8 @@ BOOST_AUTO_TEST_CASE( test_migration_restore_1_9 )
    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);
+
+   DebugEquality debug_equality; // only as affect in DEBUG build
 
 #ifdef UPDATE_TESTS
    doSave<TimeSlot>(file_name + "timeslot_default_constructor_v1.9");
@@ -65,7 +66,6 @@ BOOST_AUTO_TEST_CASE( test_migration_restore_1_9 )
    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()
diff --git a/ANattr/src/ClockAttr.cpp b/ANattr/src/ClockAttr.cpp
index 7467457..76a4099 100644
--- a/ANattr/src/ClockAttr.cpp
+++ b/ANattr/src/ClockAttr.cpp
@@ -91,15 +91,68 @@ std::string ClockAttr::toString() const
 
 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 (hybrid_ != rhs.hybrid_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "hybrid_ != rhs.hybrid_\n";
+      }
+#endif
+	   return false;
+	}
+
+	if (startStopWithServer_ != rhs.startStopWithServer_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "startStopWithServer_ (" <<  startStopWithServer_  << ") != rhs.startStopWithServer_ (" << rhs.startStopWithServer_  << ")\n";
+      }
+#endif
+	   return false;
+	}
 
-	if (day_ != rhs.day_)     return false;
-	if (month_ != rhs.month_) return false;
-	if (year_ != rhs.year_)   return false;
+	if (day_ != rhs.day_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "day(" << day_ << ") != rhs.day(" << rhs.day_ << "\n";
+      }
+#endif
+	   return false;
+	}
+
+	if (month_ != rhs.month_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "month_(" << month_ << ") != rhs.month_(" << rhs.month_ << "\n";
+      }
+#endif
+      return false;
+	}
 
-	if (gain_ != rhs.gain_) return false;
+	if (year_ != rhs.year_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "year_(" << year_ << ") != rhs.year_(" << rhs.year_ << "\n";
+      }
+#endif
+      return false;
+	}
+
+	if (gain_ != rhs.gain_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "gain_(" << gain_ << ") != rhs.gain_(" << rhs.gain_ << "\n";
+      }
+#endif
+      return false;
+	}
+
+   if (positiveGain_ != rhs.positiveGain_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "positiveGain_(" << positiveGain_ << ") != rhs.positiveGain_(" << rhs.positiveGain_ << ")\n";
+      }
+#endif
+      return false;
+   }
 
 	return true;
 }
@@ -140,6 +193,7 @@ void ClockAttr::hybrid( bool f ) {
 
 void ClockAttr::sync() {
    // When begin_calendar() is called we will sync with computer clock.
+   positiveGain_ = false;
    gain_ = 0;
    day_ = 0;
    month_ = 0 ;
diff --git a/ANattr/src/CronAttr.cpp b/ANattr/src/CronAttr.cpp
index addcc7c..e761b77 100644
--- a/ANattr/src/CronAttr.cpp
+++ b/ANattr/src/CronAttr.cpp
@@ -87,35 +87,34 @@ std::ostream& CronAttr::print(std::ostream& os) const
 
 std::string CronAttr::toString() const
 {
-	std::stringstream ss;
-	ss << "cron ";
+	std::string ret = "cron ";
 	if (!weekDays_.empty()) {
-		ss << "-w ";
+		ret += "-w ";
 		for(size_t i=0; i<weekDays_.size();++i) {
-			ss << weekDays_[i];
-			if (i !=weekDays_.size()-1) ss << ",";
+			ret += boost::lexical_cast<std::string>(weekDays_[i]);
+			if (i !=weekDays_.size()-1) ret += ",";
 		}
-		ss << " ";
+		ret += " ";
 	}
 	if (!daysOfMonth_.empty()) {
-		ss << "-d ";
+		ret += "-d ";
 		for(size_t i=0; i<daysOfMonth_.size();++i) {
-			ss << daysOfMonth_[i];
-			if (i !=daysOfMonth_.size()-1) ss << ",";
+			ret += boost::lexical_cast<std::string>(daysOfMonth_[i]);
+			if (i !=daysOfMonth_.size()-1) ret += ",";
 		}
-		ss << " ";
+		ret += " ";
 	}
 	if (!months_.empty()) {
-		ss << "-m ";
+		ret += "-m ";
 		for(size_t i=0; i<months_.size();++i) {
-			ss << months_[i];
-			if (i !=months_.size()-1) ss << ",";
+			ret += boost::lexical_cast<std::string>(months_[i]);
+			if (i !=months_.size()-1) ret += ",";
 		}
-		ss << " ";
+		ret += " ";
 	}
 
-	ss << timeSeries_.toString(); // no new line added, up to caller
- 	return ss.str();
+	ret += timeSeries_.toString(); // no new line added, up to caller
+ 	return ret;
 }
 
 std::string CronAttr::dump() const
diff --git a/ANattr/src/DateAttr.cpp b/ANattr/src/DateAttr.cpp
index 5bd2168..d7cc5b1 100644
--- a/ANattr/src/DateAttr.cpp
+++ b/ANattr/src/DateAttr.cpp
@@ -210,18 +210,17 @@ std::ostream& DateAttr::print(std::ostream& os) const
 
 std::string DateAttr::toString() const
 {
-	std::stringstream ss;
-	ss << "date ";
-	if (day_ == 0) ss << "*.";
-	else           ss << day_ << ".";
+	std::string ret = "date ";
+	if (day_ == 0) ret += "*.";
+	else         { ret += boost::lexical_cast<std::string>(day_); ret += ".";}
 
-	if (month_ == 0) ss << "*.";
-	else             ss << month_ << ".";
+	if (month_ == 0) ret += "*.";
+	else           { ret += boost::lexical_cast<std::string>(month_); ret += ".";}
 
-	if (year_ == 0) ss << "*";
-	else            ss << year_;
+	if (year_ == 0) ret += "*";
+	else            ret += boost::lexical_cast<std::string>(year_);
 
-	return ss.str();
+	return ret;
 }
 
 std::string DateAttr::dump() const
diff --git a/ANattr/src/NodeAttr.cpp b/ANattr/src/NodeAttr.cpp
index 38c3f83..4ff7068 100644
--- a/ANattr/src/NodeAttr.cpp
+++ b/ANattr/src/NodeAttr.cpp
@@ -124,11 +124,14 @@ std::ostream& Event::print( std::ostream& os ) const {
 }
 
 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 ret = "event ";
+   if ( number_ == std::numeric_limits< int >::max() )  ret += name_;
+   else {
+      ret += boost::lexical_cast<std::string>(number_);
+      ret += " ";
+      ret += name_;
+   }
+   return ret;
 }
 
 std::string Event::dump() const {
@@ -173,7 +176,7 @@ 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 << "'";
+      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() );
    }
 
@@ -215,9 +218,12 @@ std::ostream& Meter::print( std::ostream& os ) const {
 }
 
 std::string Meter::toString() const {
-   std::stringstream ss;
-   ss << "meter " << name_ << " " << min_ << " " << max_ << " " << colorChange_;
-   return ss.str();
+   std::string ret = "meter ";
+   ret += name_; ret += " ";
+   ret += boost::lexical_cast<std::string>(min_); ret += " ";
+   ret += boost::lexical_cast<std::string>(max_); ret += " ";
+   ret += boost::lexical_cast<std::string>(colorChange_);
+   return ret;
 }
 
 std::string Meter::dump() const {
diff --git a/ANattr/src/RepeatAttr.cpp b/ANattr/src/RepeatAttr.cpp
index e1dc3c6..01c237b 100644
--- a/ANattr/src/RepeatAttr.cpp
+++ b/ANattr/src/RepeatAttr.cpp
@@ -86,25 +86,6 @@ 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;
@@ -125,6 +106,19 @@ void RepeatBase::incr_state_change_no()
 #endif
 }
 
+void  RepeatBase::update_repeat_genvar() const
+{
+   // **** reset name since generated variables are not persisted
+   var_.set_name( 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.
+   var_.set_value( valueAsString() );
+}
+
+// =============================================================
+
 RepeatDate::RepeatDate( const std::string& variable,
                         int start,
                         int end,
@@ -178,6 +172,59 @@ RepeatDate::RepeatDate( const std::string& variable,
 	}
 }
 
+void RepeatDate::gen_variables(std::vector<Variable>& vec) const
+{
+   vec.push_back(yyyy_);
+   vec.push_back(mm_);
+   vec.push_back(dom_);
+   vec.push_back(dow_);
+   vec.push_back(julian_);
+   RepeatBase::gen_variables(vec);
+}
+
+const Variable& RepeatDate::find_gen_variable(const std::string& name) const
+{
+   if (name == name_) return var_;
+   if (name == yyyy_.name()) return yyyy_;
+   if (name == mm_.name()) return mm_;
+   if (name == dom_.name()) return dom_;
+   if (name == dow_.name()) return dow_;
+   if (name == julian_.name()) return julian_;
+   return Variable::EMPTY();
+}
+
+void RepeatDate::update_repeat_genvar() const
+{
+   RepeatBase::update_repeat_genvar();
+
+   yyyy_.set_name( name_ + "_YYYY");
+   mm_.set_name( name_ + "_MM");
+   dom_.set_name( name_ + "_DD");
+   dow_.set_name( name_ + "_DOW");
+   julian_.set_name( name_ + "_JULIAN");
+
+   std::string date_as_string = valueAsString();
+   boost::gregorian::date the_date(from_undelimited_string(date_as_string));
+   if (the_date.is_special()) {
+      cout << "RepeatDate::update_repeat_genvar(): error the_date.is_special() " << date_as_string << "\n";
+   }
+
+   //int day_of_year  = the_date.day_of_year();
+   int day_of_week  = the_date.day_of_week().as_number();
+   int day_of_month = the_date.day();
+   int month        = the_date.month();
+   int year         = the_date.year();
+
+   yyyy_.set_value(boost::lexical_cast<std::string>(year));
+   mm_.set_value(boost::lexical_cast<std::string>(month));
+   dom_.set_value(boost::lexical_cast<std::string>(day_of_month));
+   dow_.set_value(boost::lexical_cast<std::string>(day_of_week));
+
+   long last_value = last_valid_value();
+   long julian = Cal::date_to_julian( last_value );
+   julian_.set_value(boost::lexical_cast<std::string>(julian));
+}
+
 bool RepeatDate::compare(RepeatBase* rb) const
 {
 	RepeatDate* rhs = dynamic_cast<RepeatDate*>(rb);
@@ -226,12 +273,16 @@ void RepeatDate::reset() {
 
 std::string RepeatDate::toString() const
 {
-	std::stringstream ss;
-	ss << "repeat date " << name_ << " " << start_ << " " << end_ << " " << delta_;
+	std::string ret = "repeat date ";  ret += name_; ret += " ";
+   ret += boost::lexical_cast<std::string>(start_); ret += " ";
+   ret += boost::lexical_cast<std::string>(end_);   ret += " ";
+   ret += boost::lexical_cast<std::string>(delta_);
+
 	if (!PrintStyle::defsStyle() && (value_ != start_)) {
-	   ss << " # " << value_;
+	   ret += " # ";
+	   ret += boost::lexical_cast<std::string>(value_);
 	}
-	return ss.str();
+	return ret;
 }
 std::string RepeatDate::dump() const
 {
@@ -455,13 +506,16 @@ void RepeatInteger::setToLastValue()
 
 std::string RepeatInteger::toString() const
 {
-	std::stringstream ss;
-	ss << "repeat integer " << name_ << " " << start_ << " " << end_;
- 	if (delta_ != 1) ss << " " << delta_;
+   std::string ret = "repeat integer ";  ret += name_; ret += " ";
+   ret += boost::lexical_cast<std::string>(start_);  ret += " ";
+   ret += boost::lexical_cast<std::string>(end_);
+   if (delta_ != 1) { ret += " ";  ret += boost::lexical_cast<std::string>(delta_); }
+
    if (!PrintStyle::defsStyle() && (value_ != start_)) {
-      ss << " # " << value_;
+      ret += " # ";
+      ret += boost::lexical_cast<std::string>(value_);
    }
-	return ss.str();
+   return ret;
 }
 std::string RepeatInteger::dump() const
 {
@@ -473,18 +527,43 @@ std::string RepeatInteger::dump() const
 bool RepeatInteger::operator==(const RepeatInteger& rhs) const
 {
 	if (name_ != rhs.name_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "RepeatInteger::operator==( name_(" << name_ << ") != rhs.name_(" << rhs.name_ << "))" << "\n";
+      }
+#endif
 		return false;
 	}
 	if (start_ != rhs.start_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "RepeatInteger::operator==( start_(" << start_ << ") != rhs.start_(" << rhs.start_ << "))" << "\n";
+      }
+#endif
 		return false;
 	}
 	if (end_ != rhs.end_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "RepeatInteger::operator==( end_(" << end_ << ") != rhs.end_(" << rhs.end_ << "))" << "\n";
+      }
+#endif
 		return false;
 	}
 	if (delta_ != rhs.delta_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "RepeatInteger::operator==( delta_(" << delta_ << ") != rhs.delta_(" << rhs.delta_ << "))" << "\n";
+      }
+#endif
 		return false;
 	}
    if (value_ != rhs.value_) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "RepeatInteger::operator==( value_(" << value_ << ") != rhs.value_(" << rhs.value_ << "))" << "\n";
+      }
+#endif
       return false;
    }
 	return true;
@@ -534,13 +613,13 @@ bool RepeatEnumerated::compare(RepeatBase* rb) const
 
 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 ret = "repeat enumerated ";  ret += name_;
+   BOOST_FOREACH(const string& s, theEnums_) { ret += " \""; ret += s; ret += "\""; }
+   if (!PrintStyle::defsStyle() && (currentIndex_ != 0)) {
+      ret += " # ";
+      ret += boost::lexical_cast<std::string>(currentIndex_);
+   }
+   return ret;
 }
 std::string RepeatEnumerated::dump() const
 {
@@ -726,13 +805,13 @@ bool RepeatString::compare(RepeatBase* rb) const
 
 std::string RepeatString::toString() const
 {
-	std::stringstream ss;
-	ss << "repeat string " << name_;
- 	BOOST_FOREACH(const string& s, theStrings_) { ss << " \"" << s << "\""; }
+   std::string ret = "repeat string ";  ret += name_;
+   BOOST_FOREACH(const string& s, theStrings_) { ret += " \""; ret += s; ret += "\""; }
    if (!PrintStyle::defsStyle() && (currentIndex_ != 0)) {
-      ss << " # " << value();
+      ret += " # ";
+      ret += boost::lexical_cast<std::string>(value());
    }
- 	return ss.str();
+   return ret;
 }
 std::string RepeatString::dump() const
 {
@@ -852,9 +931,9 @@ bool RepeatDay::compare(RepeatBase* rb) const
 
 std::string RepeatDay::toString() const
 {
-	std::stringstream ss;
-	ss << "repeat day " << step_;
- 	return ss.str();
+   std::string ret = "repeat day ";
+   ret += boost::lexical_cast<std::string>(step_);
+   return ret;
 }
 
 std::string RepeatDay::dump() const
diff --git a/ANattr/src/RepeatAttr.hpp b/ANattr/src/RepeatAttr.hpp
index 40bde2e..2c72139 100644
--- a/ANattr/src/RepeatAttr.hpp
+++ b/ANattr/src/RepeatAttr.hpp
@@ -45,13 +45,15 @@ public:
 
    /// 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;
 
+   // Handle generated variables
+   virtual void gen_variables(std::vector<Variable>& vec) const { vec.push_back(var_);}
+   virtual const Variable& find_gen_variable(const std::string& name) const { return name == name_ ? var_ : Variable::EMPTY(); }
+   virtual void update_repeat_genvar() const;
+
    // 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
@@ -120,6 +122,10 @@ 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 void gen_variables(std::vector<Variable>& vec) const;
+   virtual const Variable& find_gen_variable(const std::string& name) const;
+   virtual void update_repeat_genvar() const;
+
    virtual int start() const  { return start_; }
    virtual int end() const    { return end_;   }
    virtual int step() const   { return delta_; }
@@ -160,6 +166,12 @@ private:
    int  delta_;
    long value_;
 
+   mutable Variable yyyy_;         // *not* persisted
+   mutable Variable mm_;           // *not* persisted
+   mutable Variable dom_;          // *not* persisted
+   mutable Variable dow_;          // *not* persisted
+   mutable Variable julian_;       // *not* persisted
+
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int /*version*/) {
@@ -406,8 +418,10 @@ public:
    void clear() { delete repeatType_; repeatType_ = 0;}
 
    const std::string& name() const;
-   const Variable& gen_variable() const;
-   void update_repeat_genvar() const;
+
+   void gen_variables(std::vector<Variable>& vec) const { if (repeatType_) repeatType_->gen_variables(vec);}
+   const Variable& find_gen_variable(const std::string& name) const { return (repeatType_) ? repeatType_->find_gen_variable(name) : Variable::EMPTY();}
+   void update_repeat_genvar() const { if (repeatType_) repeatType_->update_repeat_genvar();}
 
    int start() const  { return (repeatType_) ? repeatType_->start() : 0;}
    int end() const    { return (repeatType_) ? repeatType_->end()   : 0;}
diff --git a/ANattr/src/Variable.cpp b/ANattr/src/Variable.cpp
index be83ee1..d49edca 100644
--- a/ANattr/src/Variable.cpp
+++ b/ANattr/src/Variable.cpp
@@ -60,6 +60,15 @@ std::ostream& Variable::print( std::ostream& os ) const {
    return Indentor::indent( os ) << toString() << "\n";
 }
 
+std::ostream& Variable::print_server_variable( 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() << " # server\n";
+}
+
 std::ostream& Variable::print_generated( std::ostream& os ) const {
    Indentor in;
    return Indentor::indent( os ) << "# " << toString() << "\n";
diff --git a/ANattr/src/Variable.hpp b/ANattr/src/Variable.hpp
index 0796228..42ba852 100644
--- a/ANattr/src/Variable.hpp
+++ b/ANattr/src/Variable.hpp
@@ -38,6 +38,7 @@ public:
 
    const std::string& name() const   { return  name_;}
    std::ostream& print(std::ostream&) const;
+   std::ostream& print_server_variable(std::ostream&) const;
    std::ostream& print_generated(std::ostream&) const;
    bool empty() const { return name_.empty(); }
 
diff --git a/ANattr/src/VerifyAttr.hpp b/ANattr/src/VerifyAttr.hpp
index fb79dc9..0b0783b 100644
--- a/ANattr/src/VerifyAttr.hpp
+++ b/ANattr/src/VerifyAttr.hpp
@@ -31,8 +31,8 @@
 // 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(NState::State state,int expected,int actual = 0)
+		: state_(state), expected_(expected), actual_(actual), state_change_no_(0) {}
 	VerifyAttr()
 		: state_(NState::UNKNOWN), expected_(0), actual_(0),state_change_no_(0) {}
 
diff --git a/ANattr/src/ZombieAttr.cpp b/ANattr/src/ZombieAttr.cpp
index f20f13c..4467843 100644
--- a/ANattr/src/ZombieAttr.cpp
+++ b/ANattr/src/ZombieAttr.cpp
@@ -70,17 +70,15 @@ std::ostream& ZombieAttr::print(std::ostream& os) const
 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();
+	std::string ret = "zombie ";
+	ret += Child::to_string(zombie_type_);
+	ret += Str::COLON();
+	ret += User::to_string(action_);
+	ret += Str::COLON();
+	ret += Child::to_string(child_cmds_);
+	ret += Str::COLON();
+	ret += boost::lexical_cast<std::string>(zombie_lifetime_);
+	return ret;
 }
 
 bool ZombieAttr::fob( ecf::Child::CmdType child_cmd) const
diff --git a/ANattr/test/TestAttrSerialization.cpp b/ANattr/test/TestAttrSerialization.cpp
index a998bf1..bc05cfc 100644
--- a/ANattr/test/TestAttrSerialization.cpp
+++ b/ANattr/test/TestAttrSerialization.cpp
@@ -280,14 +280,7 @@ 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);
+   std::vector<ecf::Child::CmdType> child_cmds = ecf::Child::list();
 
    doSaveAndRestore(fileName,ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10));
    doSaveAndRestore(fileName,ZombieAttr(ecf::Child::PATH, child_cmds, ecf::User::FAIL,10));
diff --git a/ANattr/test/TestMigration.cpp b/ANattr/test/TestMigration.cpp
index df4d8b4..5f3cb56 100644
--- a/ANattr/test/TestMigration.cpp
+++ b/ANattr/test/TestMigration.cpp
@@ -121,14 +121,7 @@ BOOST_AUTO_TEST_CASE( test_migration_restore )
    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);
+   std::vector<ecf::Child::CmdType> child_cmds = ecf::Child::list();
 
    Label label("name","value");
    label.set_new_value("new_value");
diff --git a/ANattr/test/TestRepeat.cpp b/ANattr/test/TestRepeat.cpp
index 3a25070..0c41073 100644
--- a/ANattr/test/TestRepeat.cpp
+++ b/ANattr/test/TestRepeat.cpp
@@ -20,6 +20,7 @@
 #include <boost/date_time/posix_time/posix_time_types.hpp>
 
 #include "RepeatAttr.hpp"
+#include "Cal.hpp"
 
 using namespace std;
 using namespace boost::gregorian;
@@ -585,6 +586,154 @@ BOOST_AUTO_TEST_CASE( test_repeat_date_xref_to_boost_date )
    check_date(20150514,20150730,7);
 }
 
+BOOST_AUTO_TEST_CASE( test_repeat_date_generated_variables )
+{
+   cout << "ANattr:: ...test_repeat_date_generated_variables\n";
+
+    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");
+    rep.update_repeat_genvar();
+    std::vector<Variable> vec;
+    rep.gen_variables(vec);
+    BOOST_CHECK_MESSAGE(vec.size() == 6,"expected 6 generated variables but found " << vec.size());
+
+    {const Variable& var = rep.find_gen_variable("YMD");
+    BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_YYYY");
+    BOOST_CHECK_MESSAGE(var.theValue() == "20090916", "expected year to be 20090916  but found " << var.theValue() );}
+
+    {const Variable& var = rep.find_gen_variable("YMD_YYYY");
+    BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_YYYY");
+    BOOST_CHECK_MESSAGE(var.theValue() == "2009", "expected year to be 2009  but found " << var.theValue() );}
+
+    {const Variable& var = rep.find_gen_variable("YMD_MM");
+    BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_MM");
+    BOOST_CHECK_MESSAGE(var.theValue() == "9", "expected month to be 9  but found " << var.theValue() );}
+
+    {const Variable& var = rep.find_gen_variable("YMD_DD");
+    BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_DD");
+    BOOST_CHECK_MESSAGE(var.theValue() == "16", "expected day of month to be 16 but found " << var.theValue() );}
+
+    {const Variable& var = rep.find_gen_variable("YMD_DOW");
+    BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_DOW");
+    BOOST_CHECK_MESSAGE(var.theValue() == "3", "expected day of week to be 3 but found " << var.theValue() );}
+
+    {const Variable& var = rep.find_gen_variable("YMD_JULIAN");
+    BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_JULIAN");
+    std::string expected = boost::lexical_cast<std::string>(Cal::date_to_julian(20090916));
+    BOOST_CHECK_MESSAGE(var.theValue() == expected, "expected " << expected << " but found " << var.theValue() );}
+}
+
+BOOST_AUTO_TEST_CASE( test_repeat_date_generated_variables2 )
+{
+   cout << "ANattr:: ...test_repeat_date_generated_variables\n";
+
+   int start = 20161231;
+   int end = 20170106;
+   Repeat rep(RepeatDate("YMD",start,end,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() == start ,"Start should be " << start);
+   BOOST_CHECK_MESSAGE(rep.end() == end ,"end should be " << end << " but found " << rep.end());
+   BOOST_CHECK_MESSAGE(rep.step() == 1,"step should be 1");
+   BOOST_CHECK_MESSAGE(rep.value() == start,"value should be " << start << " but found " << rep.value());
+   BOOST_CHECK_MESSAGE(rep.last_valid_value() == start,"last_valid_value should be " << start << " but found " << rep.last_valid_value());
+
+   std::vector<std::string> expected_YMD;
+   expected_YMD.push_back("20161231");
+   expected_YMD.push_back("20170101");
+   expected_YMD.push_back("20170102");
+   expected_YMD.push_back("20170103");
+   expected_YMD.push_back("20170104");
+   expected_YMD.push_back("20170105");
+   expected_YMD.push_back("20170106");
+
+   std::vector<std::string> expected_year;
+   expected_year.push_back("2016");
+   expected_year.push_back("2017");
+   expected_year.push_back("2017");
+   expected_year.push_back("2017");
+   expected_year.push_back("2017");
+   expected_year.push_back("2017");
+   expected_year.push_back("2017");
+
+   std::vector<std::string> expected_MM;
+   expected_MM.push_back("12");
+   expected_MM.push_back("1");
+   expected_MM.push_back("1");
+   expected_MM.push_back("1");
+   expected_MM.push_back("1");
+   expected_MM.push_back("1");
+   expected_MM.push_back("1");
+
+   std::vector<std::string> expected_day_of_month;
+   expected_day_of_month.push_back("31");
+   expected_day_of_month.push_back("1");
+   expected_day_of_month.push_back("2");
+   expected_day_of_month.push_back("3");
+   expected_day_of_month.push_back("4");
+   expected_day_of_month.push_back("5");
+   expected_day_of_month.push_back("6");
+
+   std::vector<std::string> expected_day_of_week;
+   expected_day_of_week.push_back("6");
+   expected_day_of_week.push_back("0");
+   expected_day_of_week.push_back("1");
+   expected_day_of_week.push_back("2");
+   expected_day_of_week.push_back("3");
+   expected_day_of_week.push_back("4");
+   expected_day_of_week.push_back("5");
+
+   std::vector<std::string> expected_julian;
+   expected_julian.push_back(boost::lexical_cast<std::string>(Cal::date_to_julian(20161231)));
+   expected_julian.push_back(boost::lexical_cast<std::string>(Cal::date_to_julian(20170101)));
+   expected_julian.push_back(boost::lexical_cast<std::string>(Cal::date_to_julian(20170102)));
+   expected_julian.push_back(boost::lexical_cast<std::string>(Cal::date_to_julian(20170103)));
+   expected_julian.push_back(boost::lexical_cast<std::string>(Cal::date_to_julian(20170104)));
+   expected_julian.push_back(boost::lexical_cast<std::string>(Cal::date_to_julian(20170105)));
+   expected_julian.push_back(boost::lexical_cast<std::string>(Cal::date_to_julian(20170106)));
+
+   for(int i = 0; i < 7; i++) {
+
+      rep.update_repeat_genvar();
+      std::vector<Variable> vec;
+      rep.gen_variables(vec);
+      BOOST_CHECK_MESSAGE(vec.size() == 6,"expected 6 generated variables but found " << vec.size());
+
+      {const Variable& var = rep.find_gen_variable("YMD");
+      BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_YYYY");
+      BOOST_CHECK_MESSAGE(var.theValue() == expected_YMD[i], "expected YMD " << expected_YMD[i] << " but found " << var.theValue() );}
+
+      {const Variable& var = rep.find_gen_variable("YMD_YYYY");
+      BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_YYYY");
+      BOOST_CHECK_MESSAGE(var.theValue() == expected_year[i], "expected year to be " << expected_year[i] << " but found " << var.theValue() );}
+
+      {const Variable& var = rep.find_gen_variable("YMD_MM");
+      BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_MM");
+      BOOST_CHECK_MESSAGE(var.theValue() == expected_MM[i], "expected month to be " << expected_MM[i] << " but found " << var.theValue() );}
+
+      {const Variable& var = rep.find_gen_variable("YMD_DD");
+      BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_DD");
+      BOOST_CHECK_MESSAGE(var.theValue() == expected_day_of_month[i], "expected day of month to be " << expected_day_of_month[i] << " but found " << var.theValue() );}
+
+      {const Variable& var = rep.find_gen_variable("YMD_DOW");
+      BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_DOW");
+      BOOST_CHECK_MESSAGE(var.theValue() == expected_day_of_week[i], "expected day of week to be " << expected_day_of_week[i] << " but found " << var.theValue() );}
+
+      {const Variable& var = rep.find_gen_variable("YMD_JULIAN");
+      BOOST_CHECK_MESSAGE(!var.empty(),"Did not find generated variable YMD_JULIAN");
+      BOOST_CHECK_MESSAGE(var.theValue() == expected_julian[i], "expected " <<  expected_julian[i] << " but found " << var.theValue() );}
+
+      rep.increment();
+   }
+}
 
 BOOST_AUTO_TEST_SUITE_END()
 
diff --git a/ANode/CMakeLists.txt b/ANode/CMakeLists.txt
index 8e1c3fe..508d09f 100644
--- a/ANode/CMakeLists.txt
+++ b/ANode/CMakeLists.txt
@@ -2,18 +2,22 @@
 # 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" )
+file( GLOB srcs       RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp"  )
+file( GLOB parser_src RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "parser/src/*.cpp"  )
 
 ecbuild_add_library( TARGET   node
                      NOINSTALL
                      TYPE     STATIC
-                     SOURCES  ${srcs}
+                     SOURCES  ${srcs} ${parser_src}
                      LIBS     nodeattr core
-                     INCLUDES src
-                              ../ACore/src 
+                     INCLUDES ../ACore/src 
                               ../ANattr/src
+                              src
+                              parser/src
                     )
 
+add_subdirectory( parser )
+
 # Use following to populate list: 
 #  cd $WK/ANode                      
 #  find test -name \*.cpp | sort      
@@ -80,3 +84,4 @@ if (ENABLE_ALL_TESTS)
                     )
 endif()
 
+
diff --git a/ANode/jamfile.jam b/ANode/jamfile.jam
index f35fa00..22112ba 100644
--- a/ANode/jamfile.jam
+++ b/ANode/jamfile.jam
@@ -17,8 +17,10 @@ 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 ]
+lib node : [ glob src/*.cpp parser/src/*.cpp ]
          : <link>static
+           <include>../ANode/src
+           <include>../ANode/parser/src
            <variant>debug:<define>DEBUG
            <use>/theCore//core
            <use>/theNodeAttr//nodeattr
@@ -28,10 +30,10 @@ lib node : [ glob src/*.cpp ]
            <use>/site-config//boost_datetime
            <use>/site-config//boost_test
          :
-         : <include>../ANode/src         
+         :  <include>../ANode/src  
+            <include>../ANode/parser/src 
          ;
 
-
 #
 # This is *ONLY* required when the define ECFLOW_MT is used, (used by Signal.cpp)
 lib pthread ;
@@ -62,3 +64,5 @@ exe u_anode_stest : test/TestSingleExprParse.cpp
            /site-config//boost_test
          : <variant>debug:<define>DEBUG
  	     ;
+
+build-project parser ;
\ No newline at end of file
diff --git a/AParser/CMakeLists.txt b/ANode/parser/CMakeLists.txt
similarity index 56%
rename from AParser/CMakeLists.txt
rename to ANode/parser/CMakeLists.txt
index 4b48aa5..b717a4f 100644
--- a/AParser/CMakeLists.txt
+++ b/ANode/parser/CMakeLists.txt
@@ -2,27 +2,15 @@
 # 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                      
+#  cd $WK/ANode/parser                      
 #  find test -name \*.cpp | sort   
 list( APPEND test_srcs
    test/PersistHelper.cpp
    test/TestAutoAddExterns.cpp
    test/TestDefsStructurePersistAndReload.cpp
+   test/TestMementoPersistAndReload.cpp
    test/TestMigration.cpp
    test/TestParser.cpp
    test/TestVariableParsing.cpp
@@ -30,8 +18,12 @@ list( APPEND test_srcs
 ecbuild_add_test( TARGET       u_aparser
                   BOOST
                   SOURCES      ${test_srcs}
-                  LIBS         libparser 
-                  INCLUDES     ../ANode/test
+                  LIBS         node nodeattr core
+                  INCLUDES     src 
+                               ../../ACore/src 
+                               ../../ANattr/src 
+                               ../test       # ANode/test
+                               ../src        # ANode/src
                   TEST_DEPENDS u_anode
                 )
 
@@ -44,7 +36,12 @@ if (ENABLE_ALL_TESTS)
 	ecbuild_add_test( TARGET   perf_aparser
                       BOOST
                       SOURCES  ${t2_src}
-                      LIBS     libparser
+                      LIBS     node nodeattr core
+                      INCLUDES src 
+                               ../../ACore/src 
+                               ../../ANattr/src 
+                               ../test       # ANode/test
+                               ../src        # ANode/src
                     )
 
 	#
@@ -54,8 +51,12 @@ if (ENABLE_ALL_TESTS)
     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
+                      LIBS     node nodeattr core 
+                      INCLUDES src 
+                               ../../ACore/src 
+                               ../../ANattr/src 
+                               ../src        # ANode/src
+                               ../test       # ANode/test
                                ${Boost_INCLUDE_DIRS} 
                     )
 
@@ -67,8 +68,12 @@ if (ENABLE_ALL_TESTS)
 	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
+                      LIBS     node nodeattr core
+                      INCLUDES src 
+                               ../../ACore/src 
+                               ../../ANattr/src 
+                               ../src        # ANode/src
+                               ../test       # ANode/test
                                ${Boost_INCLUDE_DIRS} 
                    )
 endif()
\ No newline at end of file
diff --git a/AParser/Jamfile.jam b/ANode/parser/Jamfile.jam
similarity index 76%
rename from AParser/Jamfile.jam
rename to ANode/parser/Jamfile.jam
index f50e543..d6dce9b 100644
--- a/AParser/Jamfile.jam
+++ b/ANode/parser/Jamfile.jam
@@ -10,23 +10,9 @@
 #
 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         
-             ;              
+use-project theCore     : ../../ACore ;
+use-project theNodeAttr : ../../ANattr ;
+use-project theNode     : ../ ;
 
 #
 # This is *ONLY* required when the define ECFLOW_MT is used,(used by Signal.cpp)
@@ -45,13 +31,12 @@ exe u_aparser : [ glob test/*.cpp :
            /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 
+         : <include>../test              # ANode/test
            <variant>debug:<define>DEBUG
  	     ;
  	     
@@ -63,13 +48,12 @@ exe perf_aparser : test/TestSingleDefsFile.cpp test/PersistHelper.cpp
            /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 
+         : <include>../test                # ANode/test
            <variant>debug:<define>DEBUG
  	     ;
  	     
@@ -81,14 +65,13 @@ exe perf_aparser_timer : test/ParseTimer.cpp  test/PersistHelper.cpp
            /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 
+         : <include>../test                 # ANode/test
            <variant>debug:<define>DEBUG
-        ;
+         ;
         
 #
 # Tests parser for a single defs file.  
@@ -98,13 +81,11 @@ exe perf_aparser_only : test/ParseOnly.cpp
            /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 
+         : <include>../test             # ANode/test
            <variant>debug:<define>DEBUG
-        ;
-        
-	     
\ No newline at end of file
+         ;
+        
\ No newline at end of file
diff --git a/AParser/src/AutoCancelParser.cpp b/ANode/parser/src/AutoCancelParser.cpp
similarity index 100%
rename from AParser/src/AutoCancelParser.cpp
rename to ANode/parser/src/AutoCancelParser.cpp
diff --git a/AParser/src/AutoCancelParser.hpp b/ANode/parser/src/AutoCancelParser.hpp
similarity index 100%
rename from AParser/src/AutoCancelParser.hpp
rename to ANode/parser/src/AutoCancelParser.hpp
diff --git a/AParser/src/CalendarParser.cpp b/ANode/parser/src/CalendarParser.cpp
similarity index 100%
rename from AParser/src/CalendarParser.cpp
rename to ANode/parser/src/CalendarParser.cpp
diff --git a/AParser/src/CalendarParser.hpp b/ANode/parser/src/CalendarParser.hpp
similarity index 100%
rename from AParser/src/CalendarParser.hpp
rename to ANode/parser/src/CalendarParser.hpp
diff --git a/AParser/src/ClockParser.cpp b/ANode/parser/src/ClockParser.cpp
similarity index 96%
rename from AParser/src/ClockParser.cpp
rename to ANode/parser/src/ClockParser.cpp
index 76e9ada..b44905c 100644
--- a/AParser/src/ClockParser.cpp
+++ b/ANode/parser/src/ClockParser.cpp
@@ -88,7 +88,9 @@ bool ClockParser::doParse( const std::string& line,
 		// clock real 300
 		// clock real +01:00
 		// clock real 20.1.2007
-		// clock real 20.1.2007
+      // clock real 20.1.2007
+      // clock real           # on requeue we use current date
+      // clock real -s
 
 		if ( lineTokens[2].find(".") != std::string::npos ) {
 			// clock real 20.1.2007
@@ -108,9 +110,11 @@ bool ClockParser::doParse( const std::string& line,
 		   }
 		}
 		else {
-			// clock real 300
-			// clock real +01:00
-			extractTheGain(lineTokens[2], clockAttr);
+		   if (lineTokens[2] != "-s") {
+		      // clock real 300
+		      // clock real +01:00
+		      extractTheGain(lineTokens[2], clockAttr);
+		   }
 		}
 	}
 
diff --git a/AParser/src/ClockParser.hpp b/ANode/parser/src/ClockParser.hpp
similarity index 100%
rename from AParser/src/ClockParser.hpp
rename to ANode/parser/src/ClockParser.hpp
diff --git a/AParser/src/CronParser.cpp b/ANode/parser/src/CronParser.cpp
similarity index 100%
rename from AParser/src/CronParser.cpp
rename to ANode/parser/src/CronParser.cpp
diff --git a/AParser/src/CronParser.hpp b/ANode/parser/src/CronParser.hpp
similarity index 100%
rename from AParser/src/CronParser.hpp
rename to ANode/parser/src/CronParser.hpp
diff --git a/AParser/src/DateParser.cpp b/ANode/parser/src/DateParser.cpp
similarity index 100%
rename from AParser/src/DateParser.cpp
rename to ANode/parser/src/DateParser.cpp
diff --git a/AParser/src/DateParser.hpp b/ANode/parser/src/DateParser.hpp
similarity index 100%
rename from AParser/src/DateParser.hpp
rename to ANode/parser/src/DateParser.hpp
diff --git a/AParser/src/DayParser.cpp b/ANode/parser/src/DayParser.cpp
similarity index 100%
rename from AParser/src/DayParser.cpp
rename to ANode/parser/src/DayParser.cpp
diff --git a/AParser/src/DayParser.hpp b/ANode/parser/src/DayParser.hpp
similarity index 100%
rename from AParser/src/DayParser.hpp
rename to ANode/parser/src/DayParser.hpp
diff --git a/AParser/src/DefsParser.cpp b/ANode/parser/src/DefsParser.cpp
similarity index 78%
rename from AParser/src/DefsParser.cpp
rename to ANode/parser/src/DefsParser.cpp
index ea7fb71..dd5b547 100644
--- a/AParser/src/DefsParser.cpp
+++ b/ANode/parser/src/DefsParser.cpp
@@ -79,7 +79,7 @@ public:
 
 class AliasParser : public Parser {
 public:
-   AliasParser(DefsStructureParser* p, Parser* parentParser) : Parser(p) {
+   AliasParser(DefsStructureParser* p) : Parser(p) {
       reserve_vec(19);
       addParser( new VariableParser(p) );
       addParser( new LabelParser(p) );
@@ -126,6 +126,14 @@ private:
 
    void addAlias(const std::string& line,std::vector<std::string>& lineTokens) const
    {
+      if ( nodeStack().empty() && rootParser()->parsing_node_string()) {
+          alias_ptr alias = Alias::create(lineTokens[1]);
+          if (rootParser()->get_file_type() != PrintStyle::DEFS) alias->read_state(line,lineTokens);
+          nodeStack().push( std::make_pair(alias.get(),this) );
+          rootParser()->set_node_ptr(alias);
+          return;
+       }
+
       // 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");
 
@@ -153,7 +161,7 @@ private:
 
 class TaskParser : public Parser {
 public:
-   TaskParser(DefsStructureParser* p, Parser* parentParser) : Parser(p) {
+   TaskParser(DefsStructureParser* p) : Parser(p) {
       reserve_vec(21);
       addParser( new VariableParser(p) );
       addParser( new TriggerParser(p) );
@@ -174,7 +182,7 @@ public:
       addParser( new AutoCancelParser(p) );
       addParser( new VerifyParser(p) );
       addParser( new ZombieAttrParser(p) );
-      addParser( new AliasParser(p,this) );
+      addParser( new AliasParser(p) );
       addParser( new TextParser(p) );
    }
 
@@ -182,16 +190,8 @@ public:
 
 	   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
@@ -207,9 +207,22 @@ private:
 
 	void addTask(const std::string& line,std::vector<std::string>& lineTokens) const
 	{
+      if ( nodeStack().empty() && rootParser()->parsing_node_string()) {
+          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) );
+          rootParser()->set_node_ptr(task);
+          return;
+       }
+
 	   // 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");
 
+      // 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
+      }
+
 	   NodeContainer* lastAddedContainer = nodeStack_top()->isNodeContainer();
 	   if ( lastAddedContainer ) {
 
@@ -238,7 +251,7 @@ public:
    {
       reserve_vec(21);
       addParser( new VariableParser(p) );
-      addParser( new TaskParser(p,this) );
+      addParser( new TaskParser(p) );
       addParser( new TriggerParser(p) );
       addParser( new InlimitParser(p) );
       addParser( new DefsStatusParser(p) );
@@ -289,33 +302,41 @@ 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 );
+	   if ( nodeStack().empty() && rootParser()->parsing_node_string()) {
+         family_ptr family = Family::create(lineTokens[1]);
+         rootParser()->set_node_ptr(family);
+         if (rootParser()->get_file_type() != PrintStyle::DEFS) family->read_state(line,lineTokens);
+         nodeStack().push( std::make_pair(family.get(),this) );
 	   }
 	   else {
-	      // support hierarchical families
-	      Family* lastAddedFamily = nodeStack_top()->isFamily();
-	      if ( lastAddedFamily ) {
+	      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));
-	         lastAddedFamily->addFamily( family );
+	         nodeStack().push( std::make_pair(family.get(),this) );
+	         lastAddedSuite->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);
+	         // 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);
+	            }
 	         }
 	      }
 	   }
@@ -345,7 +366,7 @@ public:
       reserve_vec(18);
 	   addParser( new VariableParser(p) );
 	   addParser( new FamilyParser(p) );
-	   addParser( new TaskParser(p,this) );
+	   addParser( new TaskParser(p) );
 	   addParser( new LimitParser(p) );
 	   addParser( new DefsStatusParser(p) );
 	   addParser( new ClockParser(p) );
@@ -394,18 +415,19 @@ public:
 
 private:
 
-    void addSuite(const std::string& line,std::vector<std::string>& lineTokens) const {
+	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");
-       }
+	   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);
+	   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 );
-     }
+	   nodeStack().push( std::make_pair(suite.get(),this) );
+	   if (defsfile()) defsfile()->addSuite( suite );
+	   rootParser()->set_node_ptr( suite );
+	}
 
 	bool started_;
 };
@@ -416,7 +438,7 @@ DefsParser::DefsParser(DefsStructureParser* p) : Parser(p)
 {
    reserve_vec(5);
    addParser( new ExternParser(p) );
-	addParser( new SuiteParser(p) );
+   addParser( new SuiteParser(p) );
 
    // for defs stat only
    addParser( new DefsStateParser(p) );
@@ -424,3 +446,12 @@ DefsParser::DefsParser(DefsStructureParser* p) : Parser(p)
    addParser( new HistoryParser(p) );
 }
 
+DefsParser::DefsParser(DefsStructureParser* p, bool/*node_parser_only*/) : Parser(p)
+{
+   reserve_vec(4);
+   addParser( new TaskParser(p) );
+   addParser( new FamilyParser(p) );
+   addParser( new SuiteParser(p) );
+   addParser( new AliasParser(p) );
+}
+
diff --git a/AParser/src/DefsParser.hpp b/ANode/parser/src/DefsParser.hpp
similarity index 89%
rename from AParser/src/DefsParser.hpp
rename to ANode/parser/src/DefsParser.hpp
index 3cc1a36..efd1e7b 100644
--- a/AParser/src/DefsParser.hpp
+++ b/ANode/parser/src/DefsParser.hpp
@@ -20,7 +20,8 @@
 
 class DefsParser : public Parser {
 public:
-	DefsParser(DefsStructureParser* p);
+   DefsParser(DefsStructureParser* p);
+   DefsParser(DefsStructureParser* p, bool node_parser_only);
 	virtual const char* keyword() const { return "DEFS" ;}
 };
 
diff --git a/AParser/src/DefsStateParser.cpp b/ANode/parser/src/DefsStateParser.cpp
similarity index 100%
rename from AParser/src/DefsStateParser.cpp
rename to ANode/parser/src/DefsStateParser.cpp
diff --git a/AParser/src/DefsStateParser.hpp b/ANode/parser/src/DefsStateParser.hpp
similarity index 100%
rename from AParser/src/DefsStateParser.hpp
rename to ANode/parser/src/DefsStateParser.hpp
diff --git a/AParser/src/DefsStatusParser.cpp b/ANode/parser/src/DefsStatusParser.cpp
similarity index 100%
rename from AParser/src/DefsStatusParser.cpp
rename to ANode/parser/src/DefsStatusParser.cpp
diff --git a/AParser/src/DefsStatusParser.hpp b/ANode/parser/src/DefsStatusParser.hpp
similarity index 100%
rename from AParser/src/DefsStatusParser.hpp
rename to ANode/parser/src/DefsStatusParser.hpp
diff --git a/AParser/src/DefsStructureParser.cpp b/ANode/parser/src/DefsStructureParser.cpp
similarity index 55%
rename from AParser/src/DefsStructureParser.cpp
rename to ANode/parser/src/DefsStructureParser.cpp
index b47207e..65dc5bb 100644
--- a/AParser/src/DefsStructureParser.cpp
+++ b/ANode/parser/src/DefsStructureParser.cpp
@@ -19,7 +19,6 @@
 #include <boost/token_functions.hpp>
 
 #include "DefsStructureParser.hpp"
-#include "DefsParser.hpp"
 #include "Defs.hpp"
 #include "Version.hpp"
 #include "Str.hpp"
@@ -32,94 +31,149 @@ using namespace boost;
 
 /////////////////////////////////////////////////////////////////////////////////////
 DefsStructureParser::DefsStructureParser(Defs* defsfile,const std::string& file_name)
-: defsfile_(defsfile),defsParser_(new DefsParser(this)),
+: parsing_node_string_(false),
   infile_(file_name),
+  defsfile_(defsfile),
+  defsParser_(this),
   lineNumber_(0),
-  file_type_(PrintStyle::DEFS)
+  file_type_(PrintStyle::DEFS),
+  defs_as_string_(Str::EMPTY())
 {
+   if ( !infile_.ok() ) {
+      std::stringstream ss;
+      ss << "DefsStructureParser::DefsStructureParser: Unable to open file! " << infile_.file_name() << "\n\n";
+      ss << Version::description() << "\n";
+      error_ = ss.str();
+   }
+}
+
+DefsStructureParser::DefsStructureParser(Defs* defsfile, const std::string& str, bool)
+: parsing_node_string_(false),
+  infile_(""),
+  defsfile_(defsfile),
+  defsParser_(this),
+  lineNumber_(0),
+  file_type_(PrintStyle::DEFS),
+  defs_as_string_(str)
+{
+   if ( defs_as_string_.empty() ) {
+      std::stringstream ss;
+      ss << "DefsStructureParser::DefsStructureParser :  Unable to parse empty string\n\n";
+      ss << Version::description() << "\n";
+      error_ = ss.str();
+   }
+}
+
+DefsStructureParser::DefsStructureParser(const std::string& defs_node_string)
+: parsing_node_string_(true),
+  infile_(""),
+  defsfile_(NULL),
+  defsParser_(this,true/* only parse nodes */),
+  lineNumber_(0),
+  file_type_(PrintStyle::MIGRATE),
+  defs_as_string_(defs_node_string )
+{
+   if ( defs_as_string_.empty() ) {
+      std::stringstream ss;
+      ss << "DefsStructureParser::DefsStructureParser :  Unable to parse empty string\n\n";
+      ss << Version::description() << "\n";
+      error_ = ss.str();
+   }
 }
 
 DefsStructureParser::~DefsStructureParser()
 {
 #ifdef SHOW_PARSER_STATS
-	defsParser_->printStats();
+	defsParser_.printStats();
 #endif
 }
 
 bool DefsStructureParser::doParse(std::string& errorMsg,std::string& warningMsg)
 {
-   if (!do_parse_only(errorMsg)) {
+   if (!error_.empty()) {
+      errorMsg = error_;
       return false;
    }
 
-   if (file_type_ == PrintStyle::MIGRATE) {
+   if (defs_as_string_.empty()) {
+      if (!do_parse_file(errorMsg)) {
+         return false;
+      }
+   }
+   else {
+      if (!do_parse_string( errorMsg)) {
+         return false;
+      }
+   }
+
+   if (file_type_ == PrintStyle::MIGRATE || parsing_node_string_) {
+      warningMsg += faults_;
       return true;
    }
 
+   // Note:: if parsing_node_string_ == false, then defsfile_ == NULL
  	// 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)
+bool DefsStructureParser::do_parse_file(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
+   std::vector< std::string > lineTokens; lineTokens.reserve(30); // derived from 3199.def
+   string line;                           line.reserve(350);      // derived from 3199.def
    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();
+      if (!do_parse_line(line,lineTokens, errorMsg)) {
          return false;
       }
+   }
+   return true;
+}
 
-      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();
+bool DefsStructureParser::do_parse_string(std::string& errorMsg)
+{
+   std::vector< std::string > lineTokens; lineTokens.reserve(30); // derived from 3199.def
+   string line;                           line.reserve(350);      // derived from 3199.def
+   while ( defs_as_string_.good() ) {
+      getNextLine( line ); // will increment lineNumer_
+      if (!do_parse_line(line,lineTokens, errorMsg)) {
+         the_node_ptr_ = node_ptr();
          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;
+}
+
+bool DefsStructureParser::do_parse_line(const std::string& line,std::vector<std::string>& lineTokens,std::string& errorMsg)
+{
+   lineTokens.clear();                   // This is re-used, hence clear up front
+   Str::split(line, lineTokens);
+   if (lineTokens.empty()) return true;  // ignore empty lines
+
+   // 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_ : 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;
+   }
    return true;
 }
 
@@ -128,14 +182,13 @@ 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);
+	   if (defs_as_string_.empty()) infile_.getline(line);
+	   else                         defs_as_string_.getline(line);
 		lineNumber_++;
 	   if (file_type_ == PrintStyle::MIGRATE) {
-	      // ignore multiline for migrate, *BECAUSE* *history* for group command uses ';'
-	      return;
+	      return; // ignore multiline for migrate, *BECAUSE* *history* for group command uses ';'
 	   }
 
-
 		if (!line.empty()) {
 
 			// See if there are multi statements per line, ie task a; task b; task b # comment
@@ -202,6 +255,7 @@ void DefsStructureParser::getNextLine(std::string& line)
 #endif
 }
 
+
 bool DefsStructureParser::semiColonInEditVariable()
 {
  	if ( multi_statements_per_line_vec_[0].find("edit") != std::string::npos) {
@@ -218,3 +272,15 @@ bool DefsStructureParser::semiColonInEditVariable()
  	return false;
 }
 
+////////////////////////////////////////////////////////////////////////////////////////////////
+DefsString::DefsString(const std::string& defs_as_string): empty_(defs_as_string.empty()), index_(0)
+{
+   if (!empty_) Str::split(defs_as_string,lines_,"\n");
+}
+bool DefsString::good() const { return index_ < lines_.size();}
+void DefsString::getline(std::string& line)
+{
+   assert(good());
+   line = lines_[index_];
+   index_++;
+}
diff --git a/ANode/parser/src/DefsStructureParser.hpp b/ANode/parser/src/DefsStructureParser.hpp
new file mode 100644
index 0000000..6b6b526
--- /dev/null
+++ b/ANode/parser/src/DefsStructureParser.hpp
@@ -0,0 +1,117 @@
+#ifndef DEFS_STRUCTURE_PARSER_HPP_
+#define DEFS_STRUCTURE_PARSER_HPP_
+
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #12 $ 
+//
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0 
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
+// In applying this licence, ECMWF does not waive the 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 "File_r.hpp"
+#include "PrintStyle.hpp"
+#include "DefsParser.hpp"
+#include "Node.hpp"
+
+class Defs;
+class Node;
+class Parser;
+
+// This class is used get a line of defs format from a defs string
+class DefsString : private boost::noncopyable {
+public:
+   DefsString(const std::string& defs_as_string);
+   bool good() const;
+   void getline(std::string& line);
+   bool empty() const { return empty_; }
+private:
+   bool empty_;
+   size_t index_;
+   std::vector<std::string> lines_;
+};
+
+
+// This class is used to parse the DEFS file.
+// 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 and fault tolerant)
+class DefsStructureParser : private boost::noncopyable {
+public:
+   DefsStructureParser(Defs* defsfile, const std::string& file_name);
+   DefsStructureParser(Defs* defsfile, const std::string& def_str, bool);
+   DefsStructureParser(const std::string& defs_node_string);
+   ~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 string passed to the DefsStructureParser is node string, and always in MIGRATE mode
+   /// Only used when constructor is DefsStructureParser(const std::string& defs_node_string);
+   node_ptr the_node_ptr() const { return the_node_ptr_;}
+
+   // return the file/string type read in.
+   PrintStyle::Type_t get_file_type() const { return file_type_; }
+
+   // warn about tokens not understood.
+   std::string& faults() { return faults_;}
+
+protected: // allow test code access
+   bool do_parse_file(std::string& errorMsg);
+   bool do_parse_string(std::string& errorMsg);
+
+private:
+   bool               parsing_node_string_;
+   ecf::File_r        infile_;
+   Defs*              defsfile_;
+   DefsParser         defsParser_;        // Child parsers will be deleted as well
+   int                lineNumber_;
+   PrintStyle::Type_t file_type_;
+   DefsString         defs_as_string_;
+   node_ptr           the_node_ptr_;
+
+   std::stack< std::pair<Node*,const Parser*> > nodeStack_;  // stack of nodes used in parsing
+   std::vector<std::string> multi_statements_per_line_vec_;
+   std::string faults_;       // In MIGRATE mode we ignore unrecognised tokens, store here for later reporting
+   std::string error_;
+   std::map<Node*,bool> defStatusMap_;                       // check for duplicates
+   friend class Parser;
+
+private:
+   // read in the next line form the defs file
+   void getNextLine(std::string& line);
+   void getNextStringLine(std::string& line);
+   bool do_parse_line(const std::string& line,std::vector<std::string>& lineTokens,std::string& errorMsg);
+   bool semiColonInEditVariable();
+
+   void set_node_ptr(node_ptr node) { the_node_ptr_ = node;}
+   bool parsing_node_string() const { return parsing_node_string_;}
+
+   // store file type read in
+   void set_file_type(PrintStyle::Type_t t) { file_type_ = t; }
+
+   friend class FamilyParser; // access set_node_ptr(), parsing_node_string()
+   friend class SuiteParser;  // access set_node_ptr(), parsing_node_string()
+   friend class TaskParser;   // access set_node_ptr(), parsing_node_string()
+   friend class AliasParser;  // access set_node_ptr(), parsing_node_string()
+   friend class TriggerCompleteParser;
+   friend class DefsStateParser;
+};
+
+#endif
diff --git a/AParser/src/EventParser.cpp b/ANode/parser/src/EventParser.cpp
similarity index 100%
rename from AParser/src/EventParser.cpp
rename to ANode/parser/src/EventParser.cpp
diff --git a/AParser/src/EventParser.hpp b/ANode/parser/src/EventParser.hpp
similarity index 100%
rename from AParser/src/EventParser.hpp
rename to ANode/parser/src/EventParser.hpp
diff --git a/AParser/src/ExternParser.cpp b/ANode/parser/src/ExternParser.cpp
similarity index 100%
rename from AParser/src/ExternParser.cpp
rename to ANode/parser/src/ExternParser.cpp
diff --git a/AParser/src/ExternParser.hpp b/ANode/parser/src/ExternParser.hpp
similarity index 100%
rename from AParser/src/ExternParser.hpp
rename to ANode/parser/src/ExternParser.hpp
diff --git a/AParser/src/InlimitParser.cpp b/ANode/parser/src/InlimitParser.cpp
similarity index 100%
rename from AParser/src/InlimitParser.cpp
rename to ANode/parser/src/InlimitParser.cpp
diff --git a/AParser/src/InlimitParser.hpp b/ANode/parser/src/InlimitParser.hpp
similarity index 100%
rename from AParser/src/InlimitParser.hpp
rename to ANode/parser/src/InlimitParser.hpp
diff --git a/AParser/src/LabelParser.cpp b/ANode/parser/src/LabelParser.cpp
similarity index 100%
rename from AParser/src/LabelParser.cpp
rename to ANode/parser/src/LabelParser.cpp
diff --git a/AParser/src/LabelParser.hpp b/ANode/parser/src/LabelParser.hpp
similarity index 100%
rename from AParser/src/LabelParser.hpp
rename to ANode/parser/src/LabelParser.hpp
diff --git a/AParser/src/LateParser.cpp b/ANode/parser/src/LateParser.cpp
similarity index 100%
rename from AParser/src/LateParser.cpp
rename to ANode/parser/src/LateParser.cpp
diff --git a/AParser/src/LateParser.hpp b/ANode/parser/src/LateParser.hpp
similarity index 100%
rename from AParser/src/LateParser.hpp
rename to ANode/parser/src/LateParser.hpp
diff --git a/AParser/src/LimitParser.cpp b/ANode/parser/src/LimitParser.cpp
similarity index 100%
rename from AParser/src/LimitParser.cpp
rename to ANode/parser/src/LimitParser.cpp
diff --git a/AParser/src/LimitParser.hpp b/ANode/parser/src/LimitParser.hpp
similarity index 100%
rename from AParser/src/LimitParser.hpp
rename to ANode/parser/src/LimitParser.hpp
diff --git a/AParser/src/MeterParser.cpp b/ANode/parser/src/MeterParser.cpp
similarity index 100%
rename from AParser/src/MeterParser.cpp
rename to ANode/parser/src/MeterParser.cpp
diff --git a/AParser/src/MeterParser.hpp b/ANode/parser/src/MeterParser.hpp
similarity index 100%
rename from AParser/src/MeterParser.hpp
rename to ANode/parser/src/MeterParser.hpp
diff --git a/AParser/src/Parser.cpp b/ANode/parser/src/Parser.cpp
similarity index 94%
rename from AParser/src/Parser.cpp
rename to ANode/parser/src/Parser.cpp
index 4dca663..e7338a1 100644
--- a/AParser/src/Parser.cpp
+++ b/ANode/parser/src/Parser.cpp
@@ -96,14 +96,21 @@ bool Parser::doParse(const std::string& line, std::vector<std::string>& lineToke
    }
 
    // Does not match any parser, or leading comment
-	std::string errorMsg = "Unexpected keyword ";
+	std::string errorMsg = "# Unexpected keyword ";
 	errorMsg += *lineTokens.begin();
  	errorMsg += " found whilst parsing ";
 	errorMsg += keyword();
 	if ( !nodeStack().empty() ) {
 		errorMsg += " ";
-		errorMsg += nodeStack_top()->name();
+		errorMsg += nodeStack_top()->absNodePath();
 	}
+
+	// in MIGRATE be fault tolerant, ignore unrecognised tokens
+	if (rootParser()->get_file_type() == PrintStyle::MIGRATE) {
+	   rootParser()->faults() += errorMsg + " -> ignoring\n";
+	   return true;
+	}
+
 	throw std::runtime_error( errorMsg );
 	return false;
 }
diff --git a/AParser/src/Parser.hpp b/ANode/parser/src/Parser.hpp
similarity index 100%
rename from AParser/src/Parser.hpp
rename to ANode/parser/src/Parser.hpp
diff --git a/AParser/src/RepeatParser.cpp b/ANode/parser/src/RepeatParser.cpp
similarity index 100%
rename from AParser/src/RepeatParser.cpp
rename to ANode/parser/src/RepeatParser.cpp
diff --git a/AParser/src/RepeatParser.hpp b/ANode/parser/src/RepeatParser.hpp
similarity index 100%
rename from AParser/src/RepeatParser.hpp
rename to ANode/parser/src/RepeatParser.hpp
diff --git a/AParser/src/TimeParser.cpp b/ANode/parser/src/TimeParser.cpp
similarity index 100%
rename from AParser/src/TimeParser.cpp
rename to ANode/parser/src/TimeParser.cpp
diff --git a/AParser/src/TimeParser.hpp b/ANode/parser/src/TimeParser.hpp
similarity index 100%
rename from AParser/src/TimeParser.hpp
rename to ANode/parser/src/TimeParser.hpp
diff --git a/AParser/src/TodayParser.cpp b/ANode/parser/src/TodayParser.cpp
similarity index 100%
rename from AParser/src/TodayParser.cpp
rename to ANode/parser/src/TodayParser.cpp
diff --git a/AParser/src/TodayParser.hpp b/ANode/parser/src/TodayParser.hpp
similarity index 100%
rename from AParser/src/TodayParser.hpp
rename to ANode/parser/src/TodayParser.hpp
diff --git a/AParser/src/TriggerParser.cpp b/ANode/parser/src/TriggerParser.cpp
similarity index 100%
rename from AParser/src/TriggerParser.cpp
rename to ANode/parser/src/TriggerParser.cpp
diff --git a/AParser/src/TriggerParser.hpp b/ANode/parser/src/TriggerParser.hpp
similarity index 100%
rename from AParser/src/TriggerParser.hpp
rename to ANode/parser/src/TriggerParser.hpp
diff --git a/AParser/src/VariableParser.cpp b/ANode/parser/src/VariableParser.cpp
similarity index 86%
rename from AParser/src/VariableParser.cpp
rename to ANode/parser/src/VariableParser.cpp
index 31f6f24..1a11543 100644
--- a/AParser/src/VariableParser.cpp
+++ b/ANode/parser/src/VariableParser.cpp
@@ -84,9 +84,11 @@ bool VariableParser::doParse(
    // i.e
    //  0     1         2
    // edit var_name "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%"  #fred
+   // edit var_name "smsfetch -F %ECF_FILES% -I %ECF_INCLUDE%"  # server  // server variables on Defs
    std::string value; value.reserve(line.size()-4);
+   size_t comment_pos = 0;
    for (size_t i = 2; i < line_tokens_size; ++i) {
-      if ( lineTokens[i].at( 0 ) == '#' ) break;
+      if ( lineTokens[i].at( 0 ) == '#' ) { comment_pos = i; break; }
       if ( i != 2 ) value += " ";
       value += lineTokens[i];
    }
@@ -97,7 +99,14 @@ bool VariableParser::doParse(
       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);
+   else {
+      bool server_variable = false;
+      if ( comment_pos != 0 && comment_pos + 1 < line_tokens_size) {
+         if ( lineTokens[comment_pos+1] == "server") server_variable = true;
+      }
+      if (server_variable) defsfile()->set_server().add_or_update_server_variable(lineTokens[1], value);
+      else                 defsfile()->set_server().add_or_update_user_variables(lineTokens[1], value);
+   }
 
    return true;
 }
diff --git a/AParser/src/VariableParser.hpp b/ANode/parser/src/VariableParser.hpp
similarity index 100%
rename from AParser/src/VariableParser.hpp
rename to ANode/parser/src/VariableParser.hpp
diff --git a/AParser/src/VerifyParser.cpp b/ANode/parser/src/VerifyParser.cpp
similarity index 80%
rename from AParser/src/VerifyParser.cpp
rename to ANode/parser/src/VerifyParser.cpp
index e030a11..fc1bbc3 100644
--- a/AParser/src/VerifyParser.cpp
+++ b/ANode/parser/src/VerifyParser.cpp
@@ -23,8 +23,8 @@ using namespace std;
 bool VerifyParser::doParse( const std::string& line, std::vector<std::string >& lineTokens )
 {
 	// expect:
-	//    verify <state>:int  i.e
-	//    verify complete:3
+	//    verify <state>:<expected> # actual  i.e
+	//    verify complete:3 # 2
 	if ( lineTokens.size() < 2 ) throw std::runtime_error( "VerifyParser::doParse: Invalid verify :" + line );
 
 	if ( !nodeStack().empty() ) {
@@ -47,7 +47,16 @@ bool VerifyParser::doParse( const std::string& line, std::vector<std::string >&
 		NState::State theState = NState::toState(state);
 		int theExpectedStateCnt = Extract::theInt(expected,"Invalid verify" );
 
-		node->addVerify( VerifyAttr(theState,theExpectedStateCnt) ) ;
+		// STATE
+		int actual = 0;
+		if (lineTokens.size() >= 4) {
+		   if (lineTokens[2] == "#") {
+		      try { actual = boost::lexical_cast<int>( lineTokens[3] ); }
+		      catch ( boost::bad_lexical_cast& e ) { /* ignore could be other comment */}
+		   }
+		}
+
+		node->addVerify( VerifyAttr(theState,theExpectedStateCnt,actual) ) ;
 	}
 	return true;
 }
diff --git a/AParser/src/VerifyParser.hpp b/ANode/parser/src/VerifyParser.hpp
similarity index 100%
rename from AParser/src/VerifyParser.hpp
rename to ANode/parser/src/VerifyParser.hpp
diff --git a/AParser/src/ZombieAttrParser.cpp b/ANode/parser/src/ZombieAttrParser.cpp
similarity index 100%
rename from AParser/src/ZombieAttrParser.cpp
rename to ANode/parser/src/ZombieAttrParser.cpp
diff --git a/AParser/src/ZombieAttrParser.hpp b/ANode/parser/src/ZombieAttrParser.hpp
similarity index 100%
rename from AParser/src/ZombieAttrParser.hpp
rename to ANode/parser/src/ZombieAttrParser.hpp
diff --git a/AParser/test/ParseOnly.cpp b/ANode/parser/test/ParseOnly.cpp
similarity index 87%
rename from AParser/test/ParseOnly.cpp
rename to ANode/parser/test/ParseOnly.cpp
index f669d16..8ec9191 100644
--- a/AParser/test/ParseOnly.cpp
+++ b/ANode/parser/test/ParseOnly.cpp
@@ -16,7 +16,6 @@
 #include <iostream>
 #include <fstream>
 
-#include "DefsStructureParser.hpp"
 #include "Defs.hpp"
 #include "PrintStyle.hpp"
 
@@ -38,14 +37,14 @@ int main(int argc, char* argv[])
    std::string path = argv[1];
 
    Defs defs;
-   DefsStructureParser checkPtParser( &defs, path);
    std::string errorMsg,warningMsg;
-   if (!checkPtParser.doParse(errorMsg,warningMsg)) {
+   if (!defs.restore(path,errorMsg,warningMsg)) {
       cout << errorMsg << "\n";
       cout << warningMsg << "\n";
       return 1;
    }
-//   PrintStyle::setStyle(PrintStyle::MIGRATE);
+
+//   PrintStyle style(PrintStyle::MIGRATE);
 //   cout << defs;
    return 0;
 }
diff --git a/ANode/parser/test/ParseTimer.cpp b/ANode/parser/test/ParseTimer.cpp
new file mode 100644
index 0000000..a668963
--- /dev/null
+++ b/ANode/parser/test/ParseTimer.cpp
@@ -0,0 +1,218 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision$
+//
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the 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_file(std::string& errorMsg) { return DefsStructureParser::do_parse_file(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();
+      std::string errorMsg,warningMsg;
+      bool result = defs.restore(path,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_file(errorMsg);
+      std::cout << " Parsing Node tree *only* time           = " << timer.elapsed() << " parse(" << result << ")" << endl;
+   }
+
+   {
+      // Test time for persisting to defs file only
+      std::string tmpFilename = "tmp.def";
+
+      timer.restart();
+      defs.save_as_checkpt(tmpFilename);
+      cout << " Save as DEFS checkpoint, time taken                                   = " << timer.elapsed()  << endl;
+
+      std::remove(tmpFilename.c_str());
+   }
+   {
+      // Test time for persisting to BOOST checkpoint file only
+      std::string tmpFilename = "tmp.def";
+
+      timer.restart();
+      defs.boost_save_as_checkpt(tmpFilename);
+      cout << " Save as BOOST checkpoint, time taken                                  = " << timer.elapsed()  << endl;
+
+      std::remove(tmpFilename.c_str());
+   }
+
+   {
+      // may need to comment out output for large differences. Will double the time.
+      bool do_compare = false;
+      timer.restart();
+      PersistHelper helper;
+      bool result = helper.test_defs_checkpt_and_reload(defs,do_compare);
+      cout << " Checkpt(DEFS) and reload, 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_boost_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_boost_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_boost_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_boost_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;
+   }
+#endif
+
+   {
+      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;
+   }
+   {
+      // 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 10 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 << ")" << 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/AParser/test/PersistHelper.cpp b/ANode/parser/test/PersistHelper.cpp
similarity index 51%
rename from AParser/test/PersistHelper.cpp
rename to ANode/parser/test/PersistHelper.cpp
index d0dc948..0e1e462 100644
--- a/AParser/test/PersistHelper.cpp
+++ b/ANode/parser/test/PersistHelper.cpp
@@ -19,16 +19,15 @@
 #include <fstream>
 
 #include "PersistHelper.hpp"
-#include "DefsStructureParser.hpp"
-#include "PrintStyle.hpp"
 #include "Defs.hpp"
 #include "Ecf.hpp"
+#include "File.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)
+bool PersistHelper::test_persist_and_reload( const Defs& theInMemoryDefs, PrintStyle::Type_t file_type_on_disk,bool do_compare)
 {
  	// Write parsed file to disk, and reload, then compare defs, they should be the same
 	errorMsg_.clear();
@@ -40,35 +39,53 @@ bool PersistHelper::test_persist_and_reload( const Defs& theInMemoryDefs, PrintS
 	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;
+	   // The file MUST be written in the *SAME* form that it was read, Otherwise they will not compare:
+	   theInMemoryDefs.save_as_filename(tmpFilename,file_type_on_disk);
 	}
 
 	// Reload the file we just persisted and compare with in memory defs
 	Defs savedDef;
-	return reload_from_defs_file(theInMemoryDefs,savedDef,tmpFilename);
+	return reload_from_defs_file(theInMemoryDefs,savedDef,tmpFilename,do_compare);
 }
 
+bool PersistHelper::test_defs_checkpt_and_reload( const Defs& theInMemoryDefs, bool do_compare)
+{
+   // Write parsed file to disk, and reload, then compare defs, they should be the same
+   errorMsg_.clear();
+   file_size_ = 0;
 
-bool PersistHelper::test_checkpt_and_reload( const Defs& theInMemoryDefs, bool do_compare, ecf::Archive::Type at)
+#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:
+      theInMemoryDefs.save_as_checkpt(tmpFilename);
+   }
+
+   // Reload the file we just persisted and compare with in memory defs
+   Defs savedDef;
+   return reload_from_defs_file(theInMemoryDefs,savedDef,tmpFilename,do_compare);
+}
+
+
+bool PersistHelper::test_boost_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);
+ 	return reload_from_boost_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
+   // Write Defs to disk, and reload, then compare defs reloaded checkpt file, they should be the same
    errorMsg_.clear();
    file_size_ = 0;
+   DebugEquality debug_equality; // only as affect in DEBUG build
 
 #ifdef DEBUG
    std::string tmpFilename = "tmp_d.def";
@@ -76,11 +93,23 @@ bool PersistHelper::test_state_persist_and_reload_with_checkpt(const Defs& theIn
    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;
+      // The file MUST be written in the *SAME* form that it was read, Otherwise they will not compare:
+      theInMemoryDefs.save_as_checkpt(tmpFilename);  // will save edit history
+   }
+
+   Defs reload_strings_def;
+   {
+      // Open file, and parse as a string.
+      std::string defs_as_string;
+      if (!File::open(tmpFilename,defs_as_string)) {
+         errorMsg_ += "Could not file file: " + tmpFilename ;
+         return false;
+      }
+      std::string error_msg, warning;
+      if (!reload_strings_def.restore_from_string(defs_as_string,error_msg, warning)) {
+         errorMsg_ += error_msg ;
+         return false;
+      }
    }
 
    // Reload the file we just persisted and compare with in memory defs
@@ -90,15 +119,13 @@ bool PersistHelper::test_state_persist_and_reload_with_checkpt(const Defs& theIn
    }
 
    // 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())) {
+   Defs reloaded_boost_checkPt_defs;
+   if (!reload_from_boost_checkpt_file(theInMemoryDefs,reloaded_boost_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);
+   bool match = reloaded_defs == reloaded_boost_checkPt_defs;
 
    if (!match) {
       std::stringstream ss;
@@ -110,11 +137,11 @@ bool PersistHelper::test_state_persist_and_reload_with_checkpt(const Defs& theIn
       ss << "+++++++++++++ reloaded_defs  ++++++++++++++++++++++++++++\n";
       ss << reloaded_defs;
       ss << "++++++++++++++ reloaded_checkPt_defs  ++++++++++++++++++++++++++++\n";
-      ss << reloaded_checkPt_defs;
+      ss << reloaded_boost_checkPt_defs ;
       errorMsg_ += ss.str();
    }
    else {
-      if (compare_edit_history_ && !reloaded_defs.compare_edit_history(reloaded_checkPt_defs)) {
+      if (compare_edit_history_ && !reloaded_defs.compare_edit_history(reloaded_boost_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";
@@ -124,54 +151,96 @@ bool PersistHelper::test_state_persist_and_reload_with_checkpt(const Defs& theIn
          ss << "+++++++++++++ reloaded_defs  ++++++++++++++++++++++++++++\n";
          ss << reloaded_defs;
          ss << "++++++++++++++ reloaded_checkPt_defs  ++++++++++++++++++++++++++++\n";
-         ss << reloaded_checkPt_defs;
+         ss << reloaded_boost_checkPt_defs;
          errorMsg_ += ss.str();
       }
    }
+   if ( !reloaded_defs.compare_change_no(reloaded_boost_checkPt_defs )) {
+      errorMsg_ += "\nPersistHelper::test_state_persist_and_reload_with_checkpt: Change numbers don't compare between reloaded_defs and reloaded_boost_checkPt_defs \n";
+   }
+
+
+   // Make sure reloading def's file with state is same as the checkpt file
+   match = reload_strings_def == reloaded_boost_checkPt_defs;
+   if (!match) {
+      std::stringstream ss;
+      ss << "\nPersistHelper::test_state_persist_and_reload_with_checkpt\n";
+      ss << "In reloaded_defs file AS STRING and reloaded_checkPt_defs don't match\n";
+      ss << "+++++++++++++ in memory defs  ++++++++++++++++++++++++++++\n";
+      PrintStyle style(PrintStyle::MIGRATE); // will save edit history
+      ss << theInMemoryDefs;
+      ss << "+++++++++++++  reload_strings_def  ++++++++++++++++++++++++++++\n";
+      ss << reload_strings_def;
+      ss << "++++++++++++++ reloaded_checkPt_defs  ++++++++++++++++++++++++++++\n";
+      ss << reloaded_boost_checkPt_defs ;
+      errorMsg_ += ss.str();
+   }
+   else {
+      if (compare_edit_history_ && !reload_strings_def.compare_edit_history(reloaded_boost_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 << "+++++++++++++ reload_strings_def ++++++++++++++++++++++++++++\n";
+         ss <<  reload_strings_def;
+         ss << "++++++++++++++ reloaded_checkPt_defs  ++++++++++++++++++++++++++++\n";
+         ss << reloaded_boost_checkPt_defs;
+         errorMsg_ += ss.str();
+      }
+   }
+   if ( !reload_strings_def.compare_change_no(reloaded_boost_checkPt_defs )) {
+      errorMsg_ += "\nPersistHelper::test_state_persist_and_reload_with_checkpt: Change numbers don't compare between reload_strings_def and reloaded_boost_checkPt_defs\n";
+   }
+
    return errorMsg_.empty();
 }
 
 
-bool PersistHelper::reload_from_defs_file(const Defs& theInMemoryDefs, Defs& reloaded_defs, const std::string& tmpFilename )
+bool PersistHelper::reload_from_defs_file(const Defs& theInMemoryDefs, Defs& reloaded_defs, const std::string& tmpFilename,bool do_compare )
 {
+   DebugEquality debug_equality; // only as affect in DEBUG build
+
    std::string warningMsg;
-   DefsStructureParser defsParser( &reloaded_defs, tmpFilename );
-   bool theParse = defsParser.doParse(errorMsg_,warningMsg);
-   if (!theParse) {
+   if (!reloaded_defs.restore(tmpFilename,errorMsg_,warningMsg)) {
       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 (do_compare) {
+      // Make sure the file we just parsed match's the one we persisted
+      bool match = reloaded_defs == theInMemoryDefs;
 
-   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)) {
+      if (!match) {
          std::stringstream ss;
-         ss << "\nPersistHelper::reload_from_defs_file compare_edit_history_\n";
+         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::MIGRATE);
+         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();
+         }
+      }
+      if ( !reloaded_defs.compare_change_no( theInMemoryDefs )) {
+         errorMsg_ += "\nPersistHelper::reload_from_defs_file: Change numbers don't compare between reloaded_defs  and theInMemoryDefs  \n";
+      }
    }
 
    file_size_ = fs::file_size(tmpFilename);
@@ -180,7 +249,7 @@ bool PersistHelper::reload_from_defs_file(const Defs& theInMemoryDefs, Defs& rel
 }
 
 
-bool PersistHelper::reload_from_checkpt_file(const Defs& theInMemoryDefs,
+bool PersistHelper::reload_from_boost_checkpt_file(const Defs& theInMemoryDefs,
                                              Defs& reloaded_defs,
                                              bool do_compare ,
                                              ecf::Archive::Type at)
@@ -191,18 +260,20 @@ bool PersistHelper::reload_from_checkpt_file(const Defs& theInMemoryDefs,
 #else
    std::string tmpCheckPt_file = "tmp.check";
 #endif
-   theInMemoryDefs.save_as_checkpt(tmpCheckPt_file,at);
+   theInMemoryDefs.boost_save_as_checkpt(tmpCheckPt_file,at);
+
+   DebugEquality debug_equality; // only as affect in DEBUG build
 
    try  {
       // Parse the file we just persisted and load the defs file into memory.
-      reloaded_defs.restore_from_checkpt(tmpCheckPt_file,at);
+      reloaded_defs.boost_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 << "\nPersistHelper::reload_from_boost_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);
@@ -214,7 +285,7 @@ bool PersistHelper::reload_from_checkpt_file(const Defs& theInMemoryDefs,
          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 << "\nPersistHelper::reload_from_boost_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);
@@ -224,10 +295,13 @@ bool PersistHelper::reload_from_checkpt_file(const Defs& theInMemoryDefs,
                errorMsg_ += ss.str();
             }
          }
+         if ( !reloaded_defs.compare_change_no( theInMemoryDefs )) {
+            errorMsg_ += "\nPersistHelper::reload_from_boost_checkpt_file: Change numbers don't compare between reloaded_defs and theInMemoryDefs  \n";
+         }
       }
    }
    catch (std::exception& e) {
-      errorMsg_ =  "PersistHelper::reload_from_checkpt_file: " + string(e.what());
+      errorMsg_ =  "PersistHelper::reload_from_boost_checkpt_file: " + string(e.what());
    }
 
    file_size_ = fs::file_size(tmpCheckPt_file);
diff --git a/AParser/test/PersistHelper.hpp b/ANode/parser/test/PersistHelper.hpp
similarity index 75%
rename from AParser/test/PersistHelper.hpp
rename to ANode/parser/test/PersistHelper.hpp
index 6f5906a..d4a34ce 100644
--- a/AParser/test/PersistHelper.hpp
+++ b/ANode/parser/test/PersistHelper.hpp
@@ -29,19 +29,20 @@ 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_persist_and_reload( const Defs& theInMemoryDefs, PrintStyle::Type_t file_type_on_disk,bool do_compare = true );
+   bool test_defs_checkpt_and_reload( const Defs& theInMemoryDefs, bool do_compare = true );
+   bool test_boost_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(..)
+	///   test_persist_and_reload(..) or test_boost_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,
+   bool reload_from_defs_file( const Defs& theInMemoryDefs, Defs& reloaded_defs, const std::string& filename,bool do_compare = true );
+   bool reload_from_boost_checkpt_file(const Defs& theInMemoryDefs,
                                  Defs& reloaded_defs,
                                  bool do_compare = true,
                                  ecf::Archive::Type at = ecf::Archive::default_archive() );
diff --git a/AParser/test/TestAutoAddExterns.cpp b/ANode/parser/test/TestAutoAddExterns.cpp
similarity index 90%
rename from AParser/test/TestAutoAddExterns.cpp
rename to ANode/parser/test/TestAutoAddExterns.cpp
index 18529cc..dfe19e4 100644
--- a/AParser/test/TestAutoAddExterns.cpp
+++ b/ANode/parser/test/TestAutoAddExterns.cpp
@@ -22,7 +22,6 @@
 #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"
@@ -41,15 +40,14 @@ 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");
+   std::string path = File::test_data("ANode/parser/test/data/single_defs/test_auto_add_extern.def","parser");
 
 	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(defs.restore(path,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
diff --git a/AParser/test/TestDefsStructurePersistAndReload.cpp b/ANode/parser/test/TestDefsStructurePersistAndReload.cpp
similarity index 81%
rename from AParser/test/TestDefsStructurePersistAndReload.cpp
rename to ANode/parser/test/TestDefsStructurePersistAndReload.cpp
index 24b3604..d4ed181 100644
--- a/AParser/test/TestDefsStructurePersistAndReload.cpp
+++ b/ANode/parser/test/TestDefsStructurePersistAndReload.cpp
@@ -22,7 +22,6 @@
 #include <boost/foreach.hpp>
 
 #include "PersistHelper.hpp"
-#include "DefsStructureParser.hpp"
 #include "PrintStyle.hpp"
 #include "MyDefsFixture.hpp"
 #include "File.hpp"
@@ -38,19 +37,16 @@ BOOST_AUTO_TEST_SUITE( ParserTestSuite )
 // 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.
+// Note: Aliases are *NOT* written in the defs file BUT are when in MIGRATE
 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);
-
+	MyDefsFixture theDefsFixture;
 	PersistHelper helper;
- 	BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(theDefsFixture.defsfile_), helper.errorMsg());
+ 	BOOST_CHECK_MESSAGE( helper.test_boost_checkpt_and_reload(theDefsFixture.defsfile_), helper.errorMsg());
 
-   // Note: Aliases are *NOT* written in the defs file.
+   // Note: Aliases are *NOT* written in PrintStyle::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);
@@ -61,6 +57,16 @@ BOOST_AUTO_TEST_CASE( test_defs_structure_persistence_and_reload )
  	BOOST_CHECK_MESSAGE( helper.test_persist_and_reload(theDefsFixture.defsfile_, PrintStyle::DEFS), helper.errorMsg());
 }
 
+BOOST_AUTO_TEST_CASE( test_defs_checkpt_persistence_and_reload )
+{
+   cout << "AParser:: ...test_defs_checkpt_persistence_and_reload\n";
+
+   MyDefsFixture theDefsFixture;
+   PersistHelper helper;
+   BOOST_CHECK_MESSAGE( helper.test_boost_checkpt_and_reload(theDefsFixture.defsfile_), helper.errorMsg());
+   BOOST_CHECK_MESSAGE( helper.test_defs_checkpt_and_reload(theDefsFixture.defsfile_), helper.errorMsg());
+}
+
 
 // This test is used to find a task given a path of the form:
 // 	  suite/family/task
diff --git a/ANode/parser/test/TestMementoPersistAndReload.cpp b/ANode/parser/test/TestMementoPersistAndReload.cpp
new file mode 100644
index 0000000..f94b235
--- /dev/null
+++ b/ANode/parser/test/TestMementoPersistAndReload.cpp
@@ -0,0 +1,405 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        : Request
+// Author      : Avi
+// Revision    : $Revision$
+//
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the 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 "Defs.hpp"
+#include "Family.hpp"
+#include "Task.hpp"
+#include "PersistHelper.hpp"
+#include "Flag.hpp"
+#include "Memento.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_memento_persist_and_reload )
+{
+   std::vector<ecf::Aspect::Type> aspects;
+   bool aspect_only = false;
+   cout << "AParser:: ...test_memento_persist_and_reload\n";
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      StateMemento memento(NState::ABORTED);
+      t->set_memento(&memento,aspects,aspect_only);
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"StateMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      NodeDefStatusDeltaMemento memento(DState::ABORTED);
+      t->set_memento(&memento,aspects,aspect_only);
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeDefStatusDeltaMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      SuspendedMemento memento(true);
+      t->set_memento(&memento,aspects,aspect_only);
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"SuspendedMemento failed: " << helper.errorMsg());
+
+      SuspendedMemento memento1;
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"SuspendedMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      Event event(1);
+      NodeEventMemento memento(event);
+      t->set_memento(&memento,aspects,aspect_only); // add event
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeEventMemento failed: " << helper.errorMsg());
+
+      event.set_value(true);
+      NodeEventMemento memento1(event);           // set event
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeEventMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      Meter meter("meter",0,100);
+
+      NodeMeterMemento memento(meter);
+      t->set_memento(&memento,aspects,aspect_only); // add meter
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeMeterMemento failed: " << helper.errorMsg());
+
+      meter.set_value(100);
+      NodeMeterMemento memento1( meter);          // change meter
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeMeterMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      Label label("label","xxx");
+
+      NodeLabelMemento memento(label);
+      t->set_memento(&memento,aspects,aspect_only); // add label;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeLabelMemento failed: " << helper.errorMsg());
+
+      label.set_new_value("yyy");
+      NodeLabelMemento memento1( label );          // change label
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeLabelMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      Expression exp("1 == 0");
+
+      NodeTriggerMemento memento(exp);
+      t->set_memento(&memento,aspects,aspect_only); // add trigger;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeTriggerMemento failed: " << helper.errorMsg());
+
+      exp.setFree();
+      NodeTriggerMemento memento1( exp );          // free trigger
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeTriggerMemento failed: " << helper.errorMsg());
+
+      exp.clearFree();
+      NodeTriggerMemento memento2( exp );          // clear trigger
+      t->set_memento(&memento2,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeTriggerMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      Expression exp("1 == 0");
+
+      NodeCompleteMemento memento(exp);
+      t->set_memento(&memento,aspects,aspect_only); // add trigger;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeCompleteMemento failed: " << helper.errorMsg());
+
+      exp.setFree();
+      NodeCompleteMemento memento1( exp );          // free trigger
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeCompleteMemento failed: " << helper.errorMsg());
+
+      exp.clearFree();
+      NodeCompleteMemento memento2( exp );          // clear trigger
+      t->set_memento(&memento2,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeCompleteMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      Repeat repeat(RepeatDate("YMD",20090916,20090916,1)  );
+
+      NodeRepeatMemento memento(repeat);
+      t->set_memento(&memento,aspects,aspect_only); // add repeat;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeRepeatMemento failed: " << helper.errorMsg());
+
+      repeat.increment();
+      NodeRepeatMemento memento1( repeat );          // change repeat
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeRepeatMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      Limit limit("suiteLimit",10);
+
+      NodeLimitMemento memento(limit);
+      t->set_memento(&memento,aspects,aspect_only); // add limit;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeLimitMemento failed: " << helper.errorMsg());
+
+      std::set<std::string> paths;
+      paths.insert("/s1/t1");
+
+      limit.set_state(20,2,paths);
+      NodeLimitMemento memento1( limit );          // change limit
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeLimitMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      InLimit inlimit("suiteLimit","/path/to/node",2);
+
+      NodeInLimitMemento memento(inlimit);
+      t->set_memento(&memento,aspects,aspect_only); // add inlimit only, no state
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeInLimitMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      Variable variable("name","value");
+
+      NodeVariableMemento memento(variable);
+      t->set_memento(&memento,aspects,aspect_only); // add variable;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeVariableMemento failed: " << helper.errorMsg());
+
+      variable.set_value("new value");
+      NodeVariableMemento memento1( variable );          // change variable
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeVariableMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = 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);
+
+      NodeLateMemento memento(lateAttr);
+      t->set_memento(&memento,aspects,aspect_only); // add late;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeLateMemento failed: " << helper.errorMsg());
+
+      lateAttr.setLate(true);
+      NodeLateMemento memento1( lateAttr );          // change late
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeLateMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      ecf::TodayAttr attr(ecf::TimeSlot(10,12)) ;
+
+      NodeTodayMemento memento(attr);
+      t->set_memento(&memento,aspects,aspect_only); // add today;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeTodayMemento failed: " << helper.errorMsg());
+
+      attr.setFree();
+      NodeTodayMemento memento1( attr );          // change today
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeTodayMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      ecf::TimeAttr attr(ecf::TimeSlot(10,12)) ;
+
+      NodeTimeMemento memento(attr);
+      t->set_memento(&memento,aspects,aspect_only); // add time;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeTimeMemento failed: " << helper.errorMsg());
+
+      attr.setFree();
+      NodeTimeMemento memento1( attr );          // change time
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeTimeMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      DayAttr attr(DayAttr::MONDAY);
+
+      NodeDayMemento memento(attr);
+      t->set_memento(&memento,aspects,aspect_only); // add day;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeDayMemento failed: " << helper.errorMsg());
+
+      attr.setFree();
+      NodeDayMemento memento1( attr );          // change day
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeDayMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      DateAttr attr(1,2,2009);
+
+      NodeDateMemento memento(attr);
+      t->set_memento(&memento,aspects,aspect_only); // add date;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeDateMemento failed: " << helper.errorMsg());
+
+      attr.setFree();
+      NodeDateMemento memento1( attr );          // change date
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeDateMemento failed: " << helper.errorMsg());
+   }
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      ecf::CronAttr attr;
+      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);
+      attr.addTimeSeries(start,finish,incr);
+      attr.addWeekDays( weekdays  );
+      attr.addDaysOfMonth(daysOfMonth);
+      attr.addMonths(  months );
+
+      NodeCronMemento memento(attr);
+      t->set_memento(&memento,aspects,aspect_only); // add cron;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeCronMemento failed: " << helper.errorMsg());
+
+      attr.setFree();
+      NodeCronMemento memento1( attr );          // change cron
+      t->set_memento(&memento1,aspects,aspect_only);
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeCronMemento failed: " << helper.errorMsg());
+   }
+
+   {
+      Defs defs;
+      suite_ptr suite = defs.add_suite("s1");
+      node_ptr t = suite->add_task("t1");
+
+      std::vector<ecf::Child::CmdType> child_cmds = ecf::Child::list();
+
+      ZombieAttr attr(ecf::Child::USER, child_cmds, ecf::User::FOB,10);
+
+      NodeZombieMemento memento(attr);
+      t->set_memento(&memento,aspects,aspect_only); // add zombie;
+
+      PersistHelper helper;
+      BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs),"NodeZombieMemento failed: " << helper.errorMsg());
+   }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/AParser/test/TestMigration.cpp b/ANode/parser/test/TestMigration.cpp
similarity index 91%
rename from AParser/test/TestMigration.cpp
rename to ANode/parser/test/TestMigration.cpp
index 3137533..475c60c 100644
--- a/AParser/test/TestMigration.cpp
+++ b/ANode/parser/test/TestMigration.cpp
@@ -22,11 +22,9 @@
 #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"
@@ -130,7 +128,7 @@ BOOST_AUTO_TEST_CASE( test_state_parser )
       // Test multiple
       task->add_alias_only();
       task->add_alias_only();
-      //      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Add multiple alias failed: " << helper.errorMsg());
    }
 }
@@ -158,7 +156,7 @@ BOOST_AUTO_TEST_CASE( test_state_node_attributes )
       task_ptr task1 = suite->add_task("t2");
       task1->addLate(lateAttr1);
 
-//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+//      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Late state: failed: " << helper.errorMsg());
    }
    {
@@ -166,7 +164,7 @@ BOOST_AUTO_TEST_CASE( test_state_node_attributes )
       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;
+//      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Meter state: failed: " << helper.errorMsg());
    }
    {
@@ -178,7 +176,7 @@ BOOST_AUTO_TEST_CASE( test_state_node_attributes )
       task->addEvent(event);
       task->addEvent(event2);
       task->addEvent(event3);
-//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Event state: failed: " << helper.errorMsg());
    }
    {
@@ -187,7 +185,7 @@ BOOST_AUTO_TEST_CASE( test_state_node_attributes )
          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;
+         //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
          BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Label state: failed: " << helper.errorMsg());
       }
       {
@@ -195,7 +193,7 @@ BOOST_AUTO_TEST_CASE( test_state_node_attributes )
          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;
+         //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
          BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Label state: failed: " << helper.errorMsg());
       }
       {
@@ -203,7 +201,7 @@ BOOST_AUTO_TEST_CASE( test_state_node_attributes )
          suite_ptr suite = defs.add_suite("s1");
          Label label("name","value\nvalue");
          suite->addLabel(label);
-//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+         //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
          BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Label state: failed: " << helper.errorMsg());
       }
       {
@@ -211,7 +209,7 @@ BOOST_AUTO_TEST_CASE( test_state_node_attributes )
          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;
+         //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
          BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Label state: failed: " << helper.errorMsg());
       }
    }
@@ -228,7 +226,7 @@ BOOST_AUTO_TEST_CASE( test_state_node_attributes )
        limit.increment(1,t3->absNodePath());
        limit.increment(1,t4->absNodePath());
        suite->addLimit(limit);
-//       PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+       //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
        BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Limit state: failed: " << helper.errorMsg());
     }
 
@@ -270,7 +268,7 @@ BOOST_AUTO_TEST_CASE( test_state_node_attributes )
         rep5.increment();
         t5->addRepeat( rep5 );
 
-//        PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+        //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
         BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Repeat state: failed: " << helper.errorMsg());
      }
 }
@@ -290,7 +288,7 @@ BOOST_AUTO_TEST_CASE( test_state_time_attributes )
       task->addTime(time);
       task->addTime(time2);
       task->addTime(time3);
-//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Time state: failed: " << helper.errorMsg());
    }
    {
@@ -303,7 +301,7 @@ BOOST_AUTO_TEST_CASE( test_state_time_attributes )
       task->addToday(time);
       task->addToday(time2);
       task->addToday(time3);
-//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Today state: failed: " << helper.errorMsg());
    }
    {
@@ -315,7 +313,7 @@ BOOST_AUTO_TEST_CASE( test_state_time_attributes )
       task->addDay(day);
       task->addDay(day1);
       task->addDay(day2);
-//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Day state: failed: " << helper.errorMsg());
    }
    {
@@ -329,7 +327,7 @@ BOOST_AUTO_TEST_CASE( test_state_time_attributes )
       task->addDate(d1);
       task->addDate(d2);
       task->addDate(d3);
-//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Date state: failed: " << helper.errorMsg());
    }
    {
@@ -359,7 +357,7 @@ BOOST_AUTO_TEST_CASE( test_state_time_attributes )
       cronAttr.addTimeSeries(ts);
       task2->addCron(cronAttr);
 
-//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Date state: failed: " << helper.errorMsg());
    }
 
@@ -379,7 +377,7 @@ BOOST_AUTO_TEST_CASE( test_state_edit_history )
    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;
+   //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
    BOOST_REQUIRE_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Edit history failed: " << helper.errorMsg());
 }
 
@@ -390,19 +388,19 @@ BOOST_AUTO_TEST_CASE( test_server_state )
    {
       Defs defs;
       defs.set_server().set_state(SState::HALTED);
-//      PrintStyle::setStyle(PrintStyle::MIGRATE); std::cout << defs;
+      //      PrintStyle style(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;
+      //      PrintStyle style(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;
+      //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Set server state failed " << helper.errorMsg());
    }
    {
@@ -412,7 +410,7 @@ BOOST_AUTO_TEST_CASE( test_server_state )
       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;
+      //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
       BOOST_CHECK_MESSAGE( helper.test_state_persist_and_reload_with_checkpt(defs), "Set server variables failed " << helper.errorMsg());
    }
 }
diff --git a/AParser/test/TestParser.cpp b/ANode/parser/test/TestParser.cpp
similarity index 51%
rename from AParser/test/TestParser.cpp
rename to ANode/parser/test/TestParser.cpp
index af8ece9..fb0b65e 100644
--- a/AParser/test/TestParser.cpp
+++ b/ANode/parser/test/TestParser.cpp
@@ -43,6 +43,7 @@ void test_defs(const std::string& directory, bool pass)
 
 	BOOST_CHECK(fs::exists( full_path ));
 	BOOST_CHECK(fs::is_directory( full_path ));
+   DebugEquality debug_equality; // only as affect in DEBUG build
 
 	//std::cout << "\nIn directory: " << full_path.directory_string() << "\n\n";
 	fs::directory_iterator end_iter;
@@ -73,15 +74,26 @@ void test_defs(const std::string& directory, bool pass)
  					// 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());
+					BOOST_CHECK_MESSAGE( helper.test_boost_checkpt_and_reload(defs), relPath.string() << " " << helper.errorMsg());
 
 					// test copy constructor
-				   Ecf::set_debug_equality(true);
 					Defs copy_of_defs = Defs(defs);
 					BOOST_CHECK_MESSAGE(copy_of_defs == defs,"Error copy constructor failed " << relPath);
-				   Ecf::set_debug_equality(false);
+
+				   // Test parse by string is same as parsing by file:
+				   {
+				      std::string contents;
+				      BOOST_CHECK_MESSAGE(File::open(relPath.string(),contents) ,"Error could not open file " << relPath);
+				      // cout << "parsing file " << relPath << " by string\n";
+
+				      Defs defs2;
+				      std::string errorMsg2,warningMsg2;
+				      BOOST_CHECK_MESSAGE(defs2.restore_from_string(contents,errorMsg2,warningMsg2),
+				                          "restore from string failed for file " << relPath << "\n" << errorMsg2);
+				      BOOST_CHECK_MESSAGE(defs2 == defs,"Parse by string != parse by filename for file:\n" << relPath);
+				   }
 				}
- 			}
+			}
 			else {
 				// test expected to fail
 			   //std::cout << errorMsg << "\n";
@@ -99,7 +111,7 @@ 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");
+   std::string path = File::test_data("ANode/parser/test/data/good_defs","parser");
 
 	// All the defs in this directory are expected to pass
 	test_defs(path, true);
@@ -109,7 +121,7 @@ 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");
+   std::string path = File::test_data("ANode/parser/test/data/bad_defs","parser");
 
 	// All the defs in this directory are expected to fail
 	test_defs(path, false);
@@ -119,10 +131,72 @@ 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");
+   std::string path = File::test_data("ANode/parser/test/data/good_defs_state","parser");
 
    // All the defs in this directory are expected to pass
    test_defs(path, true);
 }
-BOOST_AUTO_TEST_SUITE_END()
 
+void test_node_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_node_defs(relPath.string(),pass);
+            continue;
+         }
+
+         //std::cout << "......Parsing file " << relPath.string() << "\n";
+         std::string file_contents;
+         if (!ecf::File::open( relPath.string(), file_contents )) {
+            std::cout << "......Could not open file" << relPath.string() << "\n";
+            continue;
+         }
+
+         // Parse string as a standalone node.
+         DefsStructureParser parser( file_contents );
+         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);
+            BOOST_CHECK_MESSAGE(parser.the_node_ptr(),"Failed to parse file " << relPath << "\n" << errorMsg);
+            //PrintStyle print_style(PrintStyle::MIGRATE);
+            //parser.the_node_ptr()->print(cout);
+         }
+         else {
+            // test expected to fail
+            //std::cout << errorMsg << "\n";
+            BOOST_CHECK_MESSAGE(!parser.the_node_ptr(),"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_node )
+{
+   cout << "AParser:: ...test_parsing_node\n";
+
+   std::string path = File::test_data("ANode/parser/test/data/good_node_defs","parser");
+
+   // All the defs in this directory are expected to pass
+   test_node_defs(path, true);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/AParser/test/TestSingleDefsFile.cpp b/ANode/parser/test/TestSingleDefsFile.cpp
similarity index 94%
rename from AParser/test/TestSingleDefsFile.cpp
rename to ANode/parser/test/TestSingleDefsFile.cpp
index 8edb7dd..3693bb2 100644
--- a/AParser/test/TestSingleDefsFile.cpp
+++ b/ANode/parser/test/TestSingleDefsFile.cpp
@@ -68,14 +68,14 @@ void test_find_task_using_path( NodeContainer* f,const Defs& defs )
 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); }
+   bool do_parse_file(std::string& errorMsg) { return DefsStructureParser::do_parse_file(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");
+   std::string path = File::test_data("ANode/parser/test/data/single_defs/mega.def","parser");
    size_t mega_file_size = fs::file_size(path);
    cout << "AParser:: ...test_single_defs " << path << " file_size(" << mega_file_size << ")\n";
 
@@ -130,9 +130,8 @@ BOOST_AUTO_TEST_CASE( test_single_defs )
    Defs defs;
    {
       timer.restart();
-      DefsStructureParser checkPtParser( &defs, path);
       std::string errorMsg,warningMsg;
-      BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),errorMsg);
+      BOOST_REQUIRE_MESSAGE(defs.restore(path,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;
    }
@@ -142,7 +141,7 @@ BOOST_AUTO_TEST_CASE( test_single_defs )
       timer.restart();
       TestDefsStructureParser checkPtParser( &local_defs, path);
       std::string errorMsg;
-      BOOST_REQUIRE_MESSAGE(checkPtParser.do_parse_only(errorMsg),errorMsg);
+      BOOST_REQUIRE_MESSAGE(checkPtParser.do_parse_file(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;
    }
@@ -207,7 +206,7 @@ BOOST_AUTO_TEST_CASE( test_single_defs )
    {
       timer.restart();
       PersistHelper helper;
-      BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(defs,true,ecf::Archive::BINARY), helper.errorMsg());
+      BOOST_CHECK_MESSAGE( helper.test_boost_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;
@@ -216,7 +215,7 @@ BOOST_AUTO_TEST_CASE( test_single_defs )
    {
       timer.restart();
       PersistHelper helper;
-      BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(defs,true,ecf::Archive::PORTABLE_BINARY), helper.errorMsg());
+      BOOST_CHECK_MESSAGE( helper.test_boost_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;
@@ -225,7 +224,7 @@ BOOST_AUTO_TEST_CASE( test_single_defs )
    {
       timer.restart();
       PersistHelper helper;
-      BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(defs,true,ecf::Archive::EOS_PORTABLE_BINARY), helper.errorMsg());
+      BOOST_CHECK_MESSAGE( helper.test_boost_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;
@@ -234,7 +233,7 @@ BOOST_AUTO_TEST_CASE( test_single_defs )
    {
       timer.restart();
       PersistHelper helper;
-      BOOST_CHECK_MESSAGE( helper.test_checkpt_and_reload(defs,true,ecf::Archive::TEXT), helper.errorMsg());
+      BOOST_CHECK_MESSAGE( helper.test_boost_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;
diff --git a/AParser/test/TestVariableParsing.cpp b/ANode/parser/test/TestVariableParsing.cpp
similarity index 92%
rename from AParser/test/TestVariableParsing.cpp
rename to ANode/parser/test/TestVariableParsing.cpp
index df8ed2b..3241e7f 100644
--- a/AParser/test/TestVariableParsing.cpp
+++ b/ANode/parser/test/TestVariableParsing.cpp
@@ -20,7 +20,6 @@
 #include "boost/filesystem/operations.hpp"
 #include "boost/filesystem/path.hpp"
 
-#include "DefsStructureParser.hpp"
 #include "Defs.hpp"
 #include "Suite.hpp"
 #include "File.hpp"
@@ -35,12 +34,11 @@ 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");
+   std::string path = File::test_data("ANode/parser/test/data/good_defs/edit/edit.def","parser");
 
 	Defs defs;
-	DefsStructureParser checkPtParser( &defs, path );
 	std::string errorMsg,warningMsg;
-  	BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),errorMsg);
+  	BOOST_REQUIRE_MESSAGE(defs.restore(path,errorMsg,warningMsg),errorMsg);
 
 //  	suite edit
 //  		edit ECF_INCLUDE /home/ma/map/sms/example/x                  # comment line
diff --git a/AParser/test/data/bad_defs/clock/clock1.def b/ANode/parser/test/data/bad_defs/clock/clock1.def
similarity index 100%
rename from AParser/test/data/bad_defs/clock/clock1.def
rename to ANode/parser/test/data/bad_defs/clock/clock1.def
diff --git a/AParser/test/data/bad_defs/clock/clock2.def b/ANode/parser/test/data/bad_defs/clock/clock2.def
similarity index 100%
rename from AParser/test/data/bad_defs/clock/clock2.def
rename to ANode/parser/test/data/bad_defs/clock/clock2.def
diff --git a/AParser/test/data/bad_defs/clock/clock3.def b/ANode/parser/test/data/bad_defs/clock/clock3.def
similarity index 100%
rename from AParser/test/data/bad_defs/clock/clock3.def
rename to ANode/parser/test/data/bad_defs/clock/clock3.def
diff --git a/AParser/test/data/bad_defs/clock/clock4.def b/ANode/parser/test/data/bad_defs/clock/clock4.def
similarity index 100%
rename from AParser/test/data/bad_defs/clock/clock4.def
rename to ANode/parser/test/data/bad_defs/clock/clock4.def
diff --git a/AParser/test/data/bad_defs/clock/clock5.def b/ANode/parser/test/data/bad_defs/clock/clock5.def
similarity index 100%
rename from AParser/test/data/bad_defs/clock/clock5.def
rename to ANode/parser/test/data/bad_defs/clock/clock5.def
diff --git a/AParser/test/data/bad_defs/clock/clock6.def b/ANode/parser/test/data/bad_defs/clock/clock6.def
similarity index 100%
rename from AParser/test/data/bad_defs/clock/clock6.def
rename to ANode/parser/test/data/bad_defs/clock/clock6.def
diff --git a/AParser/test/data/bad_defs/clock/clock7.def b/ANode/parser/test/data/bad_defs/clock/clock7.def
similarity index 100%
rename from AParser/test/data/bad_defs/clock/clock7.def
rename to ANode/parser/test/data/bad_defs/clock/clock7.def
diff --git a/AParser/test/data/bad_defs/cron/cron1.def b/ANode/parser/test/data/bad_defs/cron/cron1.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/cron1.def
rename to ANode/parser/test/data/bad_defs/cron/cron1.def
diff --git a/AParser/test/data/bad_defs/cron/cron2.def b/ANode/parser/test/data/bad_defs/cron/cron2.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/cron2.def
rename to ANode/parser/test/data/bad_defs/cron/cron2.def
diff --git a/AParser/test/data/bad_defs/cron/cron3.def b/ANode/parser/test/data/bad_defs/cron/cron3.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/cron3.def
rename to ANode/parser/test/data/bad_defs/cron/cron3.def
diff --git a/AParser/test/data/bad_defs/cron/cron4.def b/ANode/parser/test/data/bad_defs/cron/cron4.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/cron4.def
rename to ANode/parser/test/data/bad_defs/cron/cron4.def
diff --git a/AParser/test/data/bad_defs/cron/cron5.def b/ANode/parser/test/data/bad_defs/cron/cron5.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/cron5.def
rename to ANode/parser/test/data/bad_defs/cron/cron5.def
diff --git a/AParser/test/data/bad_defs/cron/cron5_1.def b/ANode/parser/test/data/bad_defs/cron/cron5_1.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/cron5_1.def
rename to ANode/parser/test/data/bad_defs/cron/cron5_1.def
diff --git a/AParser/test/data/bad_defs/cron/cron6.def b/ANode/parser/test/data/bad_defs/cron/cron6.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/cron6.def
rename to ANode/parser/test/data/bad_defs/cron/cron6.def
diff --git a/AParser/test/data/bad_defs/cron/cron7.def b/ANode/parser/test/data/bad_defs/cron/cron7.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/cron7.def
rename to ANode/parser/test/data/bad_defs/cron/cron7.def
diff --git a/AParser/test/data/bad_defs/cron/cron8.def b/ANode/parser/test/data/bad_defs/cron/cron8.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/cron8.def
rename to ANode/parser/test/data/bad_defs/cron/cron8.def
diff --git a/AParser/test/data/bad_defs/cron/repeat_with_cron.def b/ANode/parser/test/data/bad_defs/cron/repeat_with_cron.def
similarity index 100%
rename from AParser/test/data/bad_defs/cron/repeat_with_cron.def
rename to ANode/parser/test/data/bad_defs/cron/repeat_with_cron.def
diff --git a/AParser/test/data/bad_defs/date/date.def b/ANode/parser/test/data/bad_defs/date/date.def
similarity index 100%
rename from AParser/test/data/bad_defs/date/date.def
rename to ANode/parser/test/data/bad_defs/date/date.def
diff --git a/AParser/test/data/bad_defs/date/date0.def b/ANode/parser/test/data/bad_defs/date/date0.def
similarity index 100%
rename from AParser/test/data/bad_defs/date/date0.def
rename to ANode/parser/test/data/bad_defs/date/date0.def
diff --git a/AParser/test/data/bad_defs/date/date1.def b/ANode/parser/test/data/bad_defs/date/date1.def
similarity index 100%
rename from AParser/test/data/bad_defs/date/date1.def
rename to ANode/parser/test/data/bad_defs/date/date1.def
diff --git a/AParser/test/data/bad_defs/date/date2.def b/ANode/parser/test/data/bad_defs/date/date2.def
similarity index 100%
rename from AParser/test/data/bad_defs/date/date2.def
rename to ANode/parser/test/data/bad_defs/date/date2.def
diff --git a/AParser/test/data/bad_defs/date/date3.def b/ANode/parser/test/data/bad_defs/date/date3.def
similarity index 100%
rename from AParser/test/data/bad_defs/date/date3.def
rename to ANode/parser/test/data/bad_defs/date/date3.def
diff --git a/AParser/test/data/bad_defs/date/date4.def b/ANode/parser/test/data/bad_defs/date/date4.def
similarity index 100%
rename from AParser/test/data/bad_defs/date/date4.def
rename to ANode/parser/test/data/bad_defs/date/date4.def
diff --git a/AParser/test/data/bad_defs/date/date5.def b/ANode/parser/test/data/bad_defs/date/date5.def
similarity index 100%
rename from AParser/test/data/bad_defs/date/date5.def
rename to ANode/parser/test/data/bad_defs/date/date5.def
diff --git a/AParser/test/data/bad_defs/day/day.def b/ANode/parser/test/data/bad_defs/day/day.def
similarity index 100%
rename from AParser/test/data/bad_defs/day/day.def
rename to ANode/parser/test/data/bad_defs/day/day.def
diff --git a/AParser/test/data/bad_defs/defstatus/defstatus.def b/ANode/parser/test/data/bad_defs/defstatus/defstatus.def
similarity index 100%
rename from AParser/test/data/bad_defs/defstatus/defstatus.def
rename to ANode/parser/test/data/bad_defs/defstatus/defstatus.def
diff --git a/AParser/test/data/bad_defs/event/event_1.def b/ANode/parser/test/data/bad_defs/event/event_1.def
similarity index 100%
rename from AParser/test/data/bad_defs/event/event_1.def
rename to ANode/parser/test/data/bad_defs/event/event_1.def
diff --git a/AParser/test/data/bad_defs/event/event_2.def b/ANode/parser/test/data/bad_defs/event/event_2.def
similarity index 100%
rename from AParser/test/data/bad_defs/event/event_2.def
rename to ANode/parser/test/data/bad_defs/event/event_2.def
diff --git a/AParser/test/data/bad_defs/event/event_3.def b/ANode/parser/test/data/bad_defs/event/event_3.def
similarity index 100%
rename from AParser/test/data/bad_defs/event/event_3.def
rename to ANode/parser/test/data/bad_defs/event/event_3.def
diff --git a/AParser/test/data/bad_defs/event/event_4.def b/ANode/parser/test/data/bad_defs/event/event_4.def
similarity index 100%
rename from AParser/test/data/bad_defs/event/event_4.def
rename to ANode/parser/test/data/bad_defs/event/event_4.def
diff --git a/AParser/test/data/bad_defs/event/simple_event.txt b/ANode/parser/test/data/bad_defs/event/simple_event.txt
similarity index 100%
rename from AParser/test/data/bad_defs/event/simple_event.txt
rename to ANode/parser/test/data/bad_defs/event/simple_event.txt
diff --git a/AParser/test/data/bad_defs/extern/bad.def b/ANode/parser/test/data/bad_defs/extern/bad.def
similarity index 100%
rename from AParser/test/data/bad_defs/extern/bad.def
rename to ANode/parser/test/data/bad_defs/extern/bad.def
diff --git a/AParser/test/data/bad_defs/extern/complete.def b/ANode/parser/test/data/bad_defs/extern/complete.def
similarity index 100%
rename from AParser/test/data/bad_defs/extern/complete.def
rename to ANode/parser/test/data/bad_defs/extern/complete.def
diff --git a/AParser/test/data/bad_defs/extern/trigger1.def b/ANode/parser/test/data/bad_defs/extern/trigger1.def
similarity index 100%
rename from AParser/test/data/bad_defs/extern/trigger1.def
rename to ANode/parser/test/data/bad_defs/extern/trigger1.def
diff --git a/AParser/test/data/bad_defs/extern/trigger2.def b/ANode/parser/test/data/bad_defs/extern/trigger2.def
similarity index 100%
rename from AParser/test/data/bad_defs/extern/trigger2.def
rename to ANode/parser/test/data/bad_defs/extern/trigger2.def
diff --git a/AParser/test/data/bad_defs/family/family.def b/ANode/parser/test/data/bad_defs/family/family.def
similarity index 100%
rename from AParser/test/data/bad_defs/family/family.def
rename to ANode/parser/test/data/bad_defs/family/family.def
diff --git a/AParser/test/data/bad_defs/family/family_1.def b/ANode/parser/test/data/bad_defs/family/family_1.def
similarity index 100%
rename from AParser/test/data/bad_defs/family/family_1.def
rename to ANode/parser/test/data/bad_defs/family/family_1.def
diff --git a/AParser/test/data/bad_defs/family/simple_family.txt b/ANode/parser/test/data/bad_defs/family/simple_family.txt
similarity index 100%
rename from AParser/test/data/bad_defs/family/simple_family.txt
rename to ANode/parser/test/data/bad_defs/family/simple_family.txt
diff --git a/AParser/test/data/bad_defs/inlimit/limit.def b/ANode/parser/test/data/bad_defs/inlimit/limit.def
similarity index 100%
rename from AParser/test/data/bad_defs/inlimit/limit.def
rename to ANode/parser/test/data/bad_defs/inlimit/limit.def
diff --git a/AParser/test/data/bad_defs/inlimit/limt2.def b/ANode/parser/test/data/bad_defs/inlimit/limt2.def
similarity index 100%
rename from AParser/test/data/bad_defs/inlimit/limt2.def
rename to ANode/parser/test/data/bad_defs/inlimit/limt2.def
diff --git a/AParser/test/data/bad_defs/late/late.def b/ANode/parser/test/data/bad_defs/late/late.def
similarity index 100%
rename from AParser/test/data/bad_defs/late/late.def
rename to ANode/parser/test/data/bad_defs/late/late.def
diff --git a/AParser/test/data/bad_defs/late/late2.def b/ANode/parser/test/data/bad_defs/late/late2.def
similarity index 100%
rename from AParser/test/data/bad_defs/late/late2.def
rename to ANode/parser/test/data/bad_defs/late/late2.def
diff --git a/AParser/test/data/bad_defs/late/late3.def b/ANode/parser/test/data/bad_defs/late/late3.def
similarity index 100%
rename from AParser/test/data/bad_defs/late/late3.def
rename to ANode/parser/test/data/bad_defs/late/late3.def
diff --git a/AParser/test/data/bad_defs/late/late4.def b/ANode/parser/test/data/bad_defs/late/late4.def
similarity index 100%
rename from AParser/test/data/bad_defs/late/late4.def
rename to ANode/parser/test/data/bad_defs/late/late4.def
diff --git a/AParser/test/data/bad_defs/meter/meter.def b/ANode/parser/test/data/bad_defs/meter/meter.def
similarity index 100%
rename from AParser/test/data/bad_defs/meter/meter.def
rename to ANode/parser/test/data/bad_defs/meter/meter.def
diff --git a/AParser/test/data/bad_defs/meter/meter2.def b/ANode/parser/test/data/bad_defs/meter/meter2.def
similarity index 100%
rename from AParser/test/data/bad_defs/meter/meter2.def
rename to ANode/parser/test/data/bad_defs/meter/meter2.def
diff --git a/AParser/test/data/bad_defs/meter/meter3.def b/ANode/parser/test/data/bad_defs/meter/meter3.def
similarity index 100%
rename from AParser/test/data/bad_defs/meter/meter3.def
rename to ANode/parser/test/data/bad_defs/meter/meter3.def
diff --git a/AParser/test/data/bad_defs/repeat/date_missing_name.def b/ANode/parser/test/data/bad_defs/repeat/date_missing_name.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/date_missing_name.def
rename to ANode/parser/test/data/bad_defs/repeat/date_missing_name.def
diff --git a/AParser/test/data/bad_defs/repeat/duplicate_repeats_per_node.def b/ANode/parser/test/data/bad_defs/repeat/duplicate_repeats_per_node.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/duplicate_repeats_per_node.def
rename to ANode/parser/test/data/bad_defs/repeat/duplicate_repeats_per_node.def
diff --git a/AParser/test/data/bad_defs/repeat/invalid_dates.def b/ANode/parser/test/data/bad_defs/repeat/invalid_dates.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/invalid_dates.def
rename to ANode/parser/test/data/bad_defs/repeat/invalid_dates.def
diff --git a/AParser/test/data/bad_defs/repeat/invalid_dates_2.def b/ANode/parser/test/data/bad_defs/repeat/invalid_dates_2.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/invalid_dates_2.def
rename to ANode/parser/test/data/bad_defs/repeat/invalid_dates_2.def
diff --git a/AParser/test/data/bad_defs/repeat/repeat_date1.def b/ANode/parser/test/data/bad_defs/repeat/repeat_date1.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/repeat_date1.def
rename to ANode/parser/test/data/bad_defs/repeat/repeat_date1.def
diff --git a/AParser/test/data/bad_defs/repeat/repeat_date2.def b/ANode/parser/test/data/bad_defs/repeat/repeat_date2.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/repeat_date2.def
rename to ANode/parser/test/data/bad_defs/repeat/repeat_date2.def
diff --git a/AParser/test/data/bad_defs/repeat/repeat_date3.def b/ANode/parser/test/data/bad_defs/repeat/repeat_date3.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/repeat_date3.def
rename to ANode/parser/test/data/bad_defs/repeat/repeat_date3.def
diff --git a/AParser/test/data/bad_defs/repeat/repeat_integer.def b/ANode/parser/test/data/bad_defs/repeat/repeat_integer.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/repeat_integer.def
rename to ANode/parser/test/data/bad_defs/repeat/repeat_integer.def
diff --git a/AParser/test/data/bad_defs/repeat/repeat_month.def b/ANode/parser/test/data/bad_defs/repeat/repeat_month.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/repeat_month.def
rename to ANode/parser/test/data/bad_defs/repeat/repeat_month.def
diff --git a/AParser/test/data/bad_defs/repeat/repeat_with_cron.def b/ANode/parser/test/data/bad_defs/repeat/repeat_with_cron.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/repeat_with_cron.def
rename to ANode/parser/test/data/bad_defs/repeat/repeat_with_cron.def
diff --git a/AParser/test/data/bad_defs/repeat/repeat_year.def b/ANode/parser/test/data/bad_defs/repeat/repeat_year.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/repeat_year.def
rename to ANode/parser/test/data/bad_defs/repeat/repeat_year.def
diff --git a/AParser/test/data/bad_defs/repeat/string_missing_name.def b/ANode/parser/test/data/bad_defs/repeat/string_missing_name.def
similarity index 100%
rename from AParser/test/data/bad_defs/repeat/string_missing_name.def
rename to ANode/parser/test/data/bad_defs/repeat/string_missing_name.def
diff --git a/AParser/test/data/bad_defs/suite/clock.def b/ANode/parser/test/data/bad_defs/suite/clock.def
similarity index 100%
rename from AParser/test/data/bad_defs/suite/clock.def
rename to ANode/parser/test/data/bad_defs/suite/clock.def
diff --git a/AParser/test/data/bad_defs/suite/clock1.def b/ANode/parser/test/data/bad_defs/suite/clock1.def
similarity index 100%
rename from AParser/test/data/bad_defs/suite/clock1.def
rename to ANode/parser/test/data/bad_defs/suite/clock1.def
diff --git a/AParser/test/data/bad_defs/suite/simple_suite.txt b/ANode/parser/test/data/bad_defs/suite/simple_suite.txt
similarity index 100%
rename from AParser/test/data/bad_defs/suite/simple_suite.txt
rename to ANode/parser/test/data/bad_defs/suite/simple_suite.txt
diff --git a/AParser/test/data/bad_defs/task/simple_task.txt b/ANode/parser/test/data/bad_defs/task/simple_task.txt
similarity index 100%
rename from AParser/test/data/bad_defs/task/simple_task.txt
rename to ANode/parser/test/data/bad_defs/task/simple_task.txt
diff --git a/AParser/test/data/bad_defs/task/task.def b/ANode/parser/test/data/bad_defs/task/task.def
similarity index 100%
rename from AParser/test/data/bad_defs/task/task.def
rename to ANode/parser/test/data/bad_defs/task/task.def
diff --git a/AParser/test/data/bad_defs/task/task_1.def b/ANode/parser/test/data/bad_defs/task/task_1.def
similarity index 100%
rename from AParser/test/data/bad_defs/task/task_1.def
rename to ANode/parser/test/data/bad_defs/task/task_1.def
diff --git a/AParser/test/data/bad_defs/time/time.def b/ANode/parser/test/data/bad_defs/time/time.def
similarity index 100%
rename from AParser/test/data/bad_defs/time/time.def
rename to ANode/parser/test/data/bad_defs/time/time.def
diff --git a/AParser/test/data/bad_defs/time/time_1.def b/ANode/parser/test/data/bad_defs/time/time_1.def
similarity index 100%
rename from AParser/test/data/bad_defs/time/time_1.def
rename to ANode/parser/test/data/bad_defs/time/time_1.def
diff --git a/AParser/test/data/bad_defs/time/time_2.def b/ANode/parser/test/data/bad_defs/time/time_2.def
similarity index 100%
rename from AParser/test/data/bad_defs/time/time_2.def
rename to ANode/parser/test/data/bad_defs/time/time_2.def
diff --git a/AParser/test/data/bad_defs/time/time_3.def b/ANode/parser/test/data/bad_defs/time/time_3.def
similarity index 100%
rename from AParser/test/data/bad_defs/time/time_3.def
rename to ANode/parser/test/data/bad_defs/time/time_3.def
diff --git a/AParser/test/data/bad_defs/time/time_4.def b/ANode/parser/test/data/bad_defs/time/time_4.def
similarity index 100%
rename from AParser/test/data/bad_defs/time/time_4.def
rename to ANode/parser/test/data/bad_defs/time/time_4.def
diff --git a/AParser/test/data/bad_defs/time/time_5.def b/ANode/parser/test/data/bad_defs/time/time_5.def
similarity index 100%
rename from AParser/test/data/bad_defs/time/time_5.def
rename to ANode/parser/test/data/bad_defs/time/time_5.def
diff --git a/AParser/test/data/bad_defs/time/time_6.def b/ANode/parser/test/data/bad_defs/time/time_6.def
similarity index 100%
rename from AParser/test/data/bad_defs/time/time_6.def
rename to ANode/parser/test/data/bad_defs/time/time_6.def
diff --git a/AParser/test/data/bad_defs/time/time_7.def b/ANode/parser/test/data/bad_defs/time/time_7.def
similarity index 100%
rename from AParser/test/data/bad_defs/time/time_7.def
rename to ANode/parser/test/data/bad_defs/time/time_7.def
diff --git a/AParser/test/data/bad_defs/time/time_8.def b/ANode/parser/test/data/bad_defs/time/time_8.def
similarity index 100%
rename from AParser/test/data/bad_defs/time/time_8.def
rename to ANode/parser/test/data/bad_defs/time/time_8.def
diff --git a/AParser/test/data/bad_defs/today/today.def b/ANode/parser/test/data/bad_defs/today/today.def
similarity index 100%
rename from AParser/test/data/bad_defs/today/today.def
rename to ANode/parser/test/data/bad_defs/today/today.def
diff --git a/AParser/test/data/bad_defs/today/today1.def b/ANode/parser/test/data/bad_defs/today/today1.def
similarity index 100%
rename from AParser/test/data/bad_defs/today/today1.def
rename to ANode/parser/test/data/bad_defs/today/today1.def
diff --git a/AParser/test/data/bad_defs/trigger/bad_trigger2.txt b/ANode/parser/test/data/bad_defs/trigger/bad_trigger2.txt
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/bad_trigger2.txt
rename to ANode/parser/test/data/bad_defs/trigger/bad_trigger2.txt
diff --git a/AParser/test/data/bad_defs/trigger/bad_trigger3.txt b/ANode/parser/test/data/bad_defs/trigger/bad_trigger3.txt
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/bad_trigger3.txt
rename to ANode/parser/test/data/bad_defs/trigger/bad_trigger3.txt
diff --git a/AParser/test/data/bad_defs/trigger/bad_trigger4.txt b/ANode/parser/test/data/bad_defs/trigger/bad_trigger4.txt
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/bad_trigger4.txt
rename to ANode/parser/test/data/bad_defs/trigger/bad_trigger4.txt
diff --git a/AParser/test/data/bad_defs/trigger/bad_trigger5.txt b/ANode/parser/test/data/bad_defs/trigger/bad_trigger5.txt
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/bad_trigger5.txt
rename to ANode/parser/test/data/bad_defs/trigger/bad_trigger5.txt
diff --git a/AParser/test/data/bad_defs/trigger/complex.def b/ANode/parser/test/data/bad_defs/trigger/complex.def
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/complex.def
rename to ANode/parser/test/data/bad_defs/trigger/complex.def
diff --git a/AParser/test/data/bad_defs/trigger/divide_by_zero.txt b/ANode/parser/test/data/bad_defs/trigger/divide_by_zero.txt
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/divide_by_zero.txt
rename to ANode/parser/test/data/bad_defs/trigger/divide_by_zero.txt
diff --git a/AParser/test/data/bad_defs/trigger/ecflow_969.def b/ANode/parser/test/data/bad_defs/trigger/ecflow_969.def
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/ecflow_969.def
rename to ANode/parser/test/data/bad_defs/trigger/ecflow_969.def
diff --git a/AParser/test/data/bad_defs/trigger/extern_trigger.def b/ANode/parser/test/data/bad_defs/trigger/extern_trigger.def
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/extern_trigger.def
rename to ANode/parser/test/data/bad_defs/trigger/extern_trigger.def
diff --git a/AParser/test/data/bad_defs/trigger/modulo_by_zero.txt b/ANode/parser/test/data/bad_defs/trigger/modulo_by_zero.txt
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/modulo_by_zero.txt
rename to ANode/parser/test/data/bad_defs/trigger/modulo_by_zero.txt
diff --git a/AParser/test/data/bad_defs/trigger/simple_trigger_bad_expression.txt b/ANode/parser/test/data/bad_defs/trigger/simple_trigger_bad_expression.txt
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/simple_trigger_bad_expression.txt
rename to ANode/parser/test/data/bad_defs/trigger/simple_trigger_bad_expression.txt
diff --git a/AParser/test/data/bad_defs/trigger/suite_with_trigger.def b/ANode/parser/test/data/bad_defs/trigger/suite_with_trigger.def
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/suite_with_trigger.def
rename to ANode/parser/test/data/bad_defs/trigger/suite_with_trigger.def
diff --git a/AParser/test/data/bad_defs/trigger/trigger.txt b/ANode/parser/test/data/bad_defs/trigger/trigger.txt
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/trigger.txt
rename to ANode/parser/test/data/bad_defs/trigger/trigger.txt
diff --git a/AParser/test/data/bad_defs/trigger/trigger_1.def b/ANode/parser/test/data/bad_defs/trigger/trigger_1.def
similarity index 100%
rename from AParser/test/data/bad_defs/trigger/trigger_1.def
rename to ANode/parser/test/data/bad_defs/trigger/trigger_1.def
diff --git a/AParser/test/data/bad_defs/variable/bad.def b/ANode/parser/test/data/bad_defs/variable/bad.def
similarity index 100%
rename from AParser/test/data/bad_defs/variable/bad.def
rename to ANode/parser/test/data/bad_defs/variable/bad.def
diff --git a/AParser/test/data/bad_defs/variable/bad1.def b/ANode/parser/test/data/bad_defs/variable/bad1.def
similarity index 100%
rename from AParser/test/data/bad_defs/variable/bad1.def
rename to ANode/parser/test/data/bad_defs/variable/bad1.def
diff --git a/AParser/test/data/bad_defs/variable/bad2.def b/ANode/parser/test/data/bad_defs/variable/bad2.def
similarity index 100%
rename from AParser/test/data/bad_defs/variable/bad2.def
rename to ANode/parser/test/data/bad_defs/variable/bad2.def
diff --git a/AParser/test/data/bad_defs/variable/bad3.def b/ANode/parser/test/data/bad_defs/variable/bad3.def
similarity index 100%
rename from AParser/test/data/bad_defs/variable/bad3.def
rename to ANode/parser/test/data/bad_defs/variable/bad3.def
diff --git a/AParser/test/data/bad_defs/variable/bad4.def b/ANode/parser/test/data/bad_defs/variable/bad4.def
similarity index 100%
rename from AParser/test/data/bad_defs/variable/bad4.def
rename to ANode/parser/test/data/bad_defs/variable/bad4.def
diff --git a/AParser/test/data/bad_defs/variable/bad5.def b/ANode/parser/test/data/bad_defs/variable/bad5.def
similarity index 100%
rename from AParser/test/data/bad_defs/variable/bad5.def
rename to ANode/parser/test/data/bad_defs/variable/bad5.def
diff --git a/AParser/test/data/bad_defs/variable/comment.def b/ANode/parser/test/data/bad_defs/variable/comment.def
similarity index 100%
rename from AParser/test/data/bad_defs/variable/comment.def
rename to ANode/parser/test/data/bad_defs/variable/comment.def
diff --git a/AParser/test/data/bad_defs/variable/comment2.def b/ANode/parser/test/data/bad_defs/variable/comment2.def
similarity index 100%
rename from AParser/test/data/bad_defs/variable/comment2.def
rename to ANode/parser/test/data/bad_defs/variable/comment2.def
diff --git a/AParser/test/data/bad_defs/verify/verfiy3.def b/ANode/parser/test/data/bad_defs/verify/verfiy3.def
similarity index 100%
rename from AParser/test/data/bad_defs/verify/verfiy3.def
rename to ANode/parser/test/data/bad_defs/verify/verfiy3.def
diff --git a/AParser/test/data/bad_defs/verify/verify.def b/ANode/parser/test/data/bad_defs/verify/verify.def
similarity index 100%
rename from AParser/test/data/bad_defs/verify/verify.def
rename to ANode/parser/test/data/bad_defs/verify/verify.def
diff --git a/AParser/test/data/bad_defs/verify/verify2.def b/ANode/parser/test/data/bad_defs/verify/verify2.def
similarity index 100%
rename from AParser/test/data/bad_defs/verify/verify2.def
rename to ANode/parser/test/data/bad_defs/verify/verify2.def
diff --git a/AParser/test/data/bad_defs/verify/verify4.def b/ANode/parser/test/data/bad_defs/verify/verify4.def
similarity index 100%
rename from AParser/test/data/bad_defs/verify/verify4.def
rename to ANode/parser/test/data/bad_defs/verify/verify4.def
diff --git a/AParser/test/data/bad_defs/zombie/bad.def b/ANode/parser/test/data/bad_defs/zombie/bad.def
similarity index 100%
rename from AParser/test/data/bad_defs/zombie/bad.def
rename to ANode/parser/test/data/bad_defs/zombie/bad.def
diff --git a/AParser/test/data/bad_defs/zombie/bad2.def b/ANode/parser/test/data/bad_defs/zombie/bad2.def
similarity index 100%
rename from AParser/test/data/bad_defs/zombie/bad2.def
rename to ANode/parser/test/data/bad_defs/zombie/bad2.def
diff --git a/AParser/test/data/bad_defs/zombie/bad3.def b/ANode/parser/test/data/bad_defs/zombie/bad3.def
similarity index 100%
rename from AParser/test/data/bad_defs/zombie/bad3.def
rename to ANode/parser/test/data/bad_defs/zombie/bad3.def
diff --git a/AParser/test/data/bad_defs/zombie/bad4.def b/ANode/parser/test/data/bad_defs/zombie/bad4.def
similarity index 100%
rename from AParser/test/data/bad_defs/zombie/bad4.def
rename to ANode/parser/test/data/bad_defs/zombie/bad4.def
diff --git a/AParser/test/data/bad_defs/zombie/bad5.def b/ANode/parser/test/data/bad_defs/zombie/bad5.def
similarity index 100%
rename from AParser/test/data/bad_defs/zombie/bad5.def
rename to ANode/parser/test/data/bad_defs/zombie/bad5.def
diff --git a/AParser/test/data/good_defs/clock/clock.def b/ANode/parser/test/data/good_defs/clock/clock.def
similarity index 100%
rename from AParser/test/data/good_defs/clock/clock.def
rename to ANode/parser/test/data/good_defs/clock/clock.def
diff --git a/AParser/test/data/good_defs/clock/clock1.def b/ANode/parser/test/data/good_defs/clock/clock1.def
similarity index 100%
rename from AParser/test/data/good_defs/clock/clock1.def
rename to ANode/parser/test/data/good_defs/clock/clock1.def
diff --git a/AParser/test/data/good_defs/clock/clock2.def b/ANode/parser/test/data/good_defs/clock/clock2.def
similarity index 100%
rename from AParser/test/data/good_defs/clock/clock2.def
rename to ANode/parser/test/data/good_defs/clock/clock2.def
diff --git a/AParser/test/data/good_defs/clock/clock3.def b/ANode/parser/test/data/good_defs/clock/clock3.def
similarity index 100%
rename from AParser/test/data/good_defs/clock/clock3.def
rename to ANode/parser/test/data/good_defs/clock/clock3.def
diff --git a/AParser/test/data/good_defs/clock/clock4.def b/ANode/parser/test/data/good_defs/clock/clock4.def
similarity index 100%
rename from AParser/test/data/good_defs/clock/clock4.def
rename to ANode/parser/test/data/good_defs/clock/clock4.def
diff --git a/AParser/test/data/good_defs/clock/clock5.def b/ANode/parser/test/data/good_defs/clock/clock5.def
similarity index 100%
rename from AParser/test/data/good_defs/clock/clock5.def
rename to ANode/parser/test/data/good_defs/clock/clock5.def
diff --git a/AParser/test/data/good_defs/clock/clock6.def b/ANode/parser/test/data/good_defs/clock/clock6.def
similarity index 100%
rename from AParser/test/data/good_defs/clock/clock6.def
rename to ANode/parser/test/data/good_defs/clock/clock6.def
diff --git a/AParser/test/data/good_defs/comment/comment.txt b/ANode/parser/test/data/good_defs/comment/comment.txt
similarity index 100%
rename from AParser/test/data/good_defs/comment/comment.txt
rename to ANode/parser/test/data/good_defs/comment/comment.txt
diff --git a/AParser/test/data/good_defs/complete/complete.def b/ANode/parser/test/data/good_defs/complete/complete.def
similarity index 100%
rename from AParser/test/data/good_defs/complete/complete.def
rename to ANode/parser/test/data/good_defs/complete/complete.def
diff --git a/AParser/test/data/good_defs/complete/complex.def b/ANode/parser/test/data/good_defs/complete/complex.def
similarity index 100%
rename from AParser/test/data/good_defs/complete/complex.def
rename to ANode/parser/test/data/good_defs/complete/complex.def
diff --git a/AParser/test/data/good_defs/cron/cron.def b/ANode/parser/test/data/good_defs/cron/cron.def
similarity index 100%
rename from AParser/test/data/good_defs/cron/cron.def
rename to ANode/parser/test/data/good_defs/cron/cron.def
diff --git a/AParser/test/data/good_defs/cron/cron1.def b/ANode/parser/test/data/good_defs/cron/cron1.def
similarity index 100%
rename from AParser/test/data/good_defs/cron/cron1.def
rename to ANode/parser/test/data/good_defs/cron/cron1.def
diff --git a/AParser/test/data/good_defs/cron/cron2.def b/ANode/parser/test/data/good_defs/cron/cron2.def
similarity index 100%
rename from AParser/test/data/good_defs/cron/cron2.def
rename to ANode/parser/test/data/good_defs/cron/cron2.def
diff --git a/AParser/test/data/good_defs/date/date.def b/ANode/parser/test/data/good_defs/date/date.def
similarity index 100%
rename from AParser/test/data/good_defs/date/date.def
rename to ANode/parser/test/data/good_defs/date/date.def
diff --git a/AParser/test/data/good_defs/day/day.def b/ANode/parser/test/data/good_defs/day/day.def
similarity index 100%
rename from AParser/test/data/good_defs/day/day.def
rename to ANode/parser/test/data/good_defs/day/day.def
diff --git a/AParser/test/data/good_defs/defstatus/defstatus.txt b/ANode/parser/test/data/good_defs/defstatus/defstatus.txt
similarity index 100%
rename from AParser/test/data/good_defs/defstatus/defstatus.txt
rename to ANode/parser/test/data/good_defs/defstatus/defstatus.txt
diff --git a/AParser/test/data/good_defs/edit/edit.def b/ANode/parser/test/data/good_defs/edit/edit.def
similarity index 100%
rename from AParser/test/data/good_defs/edit/edit.def
rename to ANode/parser/test/data/good_defs/edit/edit.def
diff --git a/AParser/test/data/good_defs/event/event_1.def b/ANode/parser/test/data/good_defs/event/event_1.def
similarity index 100%
rename from AParser/test/data/good_defs/event/event_1.def
rename to ANode/parser/test/data/good_defs/event/event_1.def
diff --git a/AParser/test/data/good_defs/event/event_2.def b/ANode/parser/test/data/good_defs/event/event_2.def
similarity index 100%
rename from AParser/test/data/good_defs/event/event_2.def
rename to ANode/parser/test/data/good_defs/event/event_2.def
diff --git a/AParser/test/data/good_defs/event/family_event.def b/ANode/parser/test/data/good_defs/event/family_event.def
similarity index 100%
rename from AParser/test/data/good_defs/event/family_event.def
rename to ANode/parser/test/data/good_defs/event/family_event.def
diff --git a/AParser/test/data/good_defs/event/spaces.def b/ANode/parser/test/data/good_defs/event/spaces.def
similarity index 100%
rename from AParser/test/data/good_defs/event/spaces.def
rename to ANode/parser/test/data/good_defs/event/spaces.def
diff --git a/AParser/test/data/good_defs/event/suite_event.def b/ANode/parser/test/data/good_defs/event/suite_event.def
similarity index 100%
rename from AParser/test/data/good_defs/event/suite_event.def
rename to ANode/parser/test/data/good_defs/event/suite_event.def
diff --git a/AParser/test/data/good_defs/extern/extern.def b/ANode/parser/test/data/good_defs/extern/extern.def
similarity index 100%
rename from AParser/test/data/good_defs/extern/extern.def
rename to ANode/parser/test/data/good_defs/extern/extern.def
diff --git a/AParser/test/data/good_defs/extern/first.def b/ANode/parser/test/data/good_defs/extern/first.def
similarity index 100%
rename from AParser/test/data/good_defs/extern/first.def
rename to ANode/parser/test/data/good_defs/extern/first.def
diff --git a/AParser/test/data/good_defs/extern/plain.def b/ANode/parser/test/data/good_defs/extern/plain.def
similarity index 100%
rename from AParser/test/data/good_defs/extern/plain.def
rename to ANode/parser/test/data/good_defs/extern/plain.def
diff --git a/AParser/test/data/good_defs/extern/second.def b/ANode/parser/test/data/good_defs/extern/second.def
similarity index 100%
rename from AParser/test/data/good_defs/extern/second.def
rename to ANode/parser/test/data/good_defs/extern/second.def
diff --git a/AParser/test/data/good_defs/extern/simple_extern.def b/ANode/parser/test/data/good_defs/extern/simple_extern.def
similarity index 100%
rename from AParser/test/data/good_defs/extern/simple_extern.def
rename to ANode/parser/test/data/good_defs/extern/simple_extern.def
diff --git a/AParser/test/data/good_defs/family/hierarchical_family.txt b/ANode/parser/test/data/good_defs/family/hierarchical_family.txt
similarity index 100%
rename from AParser/test/data/good_defs/family/hierarchical_family.txt
rename to ANode/parser/test/data/good_defs/family/hierarchical_family.txt
diff --git a/AParser/test/data/good_defs/family/missingEnds.txt b/ANode/parser/test/data/good_defs/family/missingEnds.txt
similarity index 100%
rename from AParser/test/data/good_defs/family/missingEnds.txt
rename to ANode/parser/test/data/good_defs/family/missingEnds.txt
diff --git a/AParser/test/data/good_defs/family/simple_family.txt b/ANode/parser/test/data/good_defs/family/simple_family.txt
similarity index 100%
rename from AParser/test/data/good_defs/family/simple_family.txt
rename to ANode/parser/test/data/good_defs/family/simple_family.txt
diff --git a/AParser/test/data/good_defs/label/label.txt b/ANode/parser/test/data/good_defs/label/label.txt
similarity index 100%
rename from AParser/test/data/good_defs/label/label.txt
rename to ANode/parser/test/data/good_defs/label/label.txt
diff --git a/AParser/test/data/good_defs/label/multi_line_lables.def b/ANode/parser/test/data/good_defs/label/multi_line_lables.def
similarity index 100%
rename from AParser/test/data/good_defs/label/multi_line_lables.def
rename to ANode/parser/test/data/good_defs/label/multi_line_lables.def
diff --git a/AParser/test/data/good_defs/label/spaces.def b/ANode/parser/test/data/good_defs/label/spaces.def
similarity index 100%
rename from AParser/test/data/good_defs/label/spaces.def
rename to ANode/parser/test/data/good_defs/label/spaces.def
diff --git a/AParser/test/data/good_defs/late/late.def b/ANode/parser/test/data/good_defs/late/late.def
similarity index 100%
rename from AParser/test/data/good_defs/late/late.def
rename to ANode/parser/test/data/good_defs/late/late.def
diff --git a/AParser/test/data/good_defs/lifecycle.txt b/ANode/parser/test/data/good_defs/lifecycle.txt
similarity index 100%
rename from AParser/test/data/good_defs/lifecycle.txt
rename to ANode/parser/test/data/good_defs/lifecycle.txt
diff --git a/AParser/test/data/good_defs/limit/limit.def b/ANode/parser/test/data/good_defs/limit/limit.def
similarity index 70%
rename from AParser/test/data/good_defs/limit/limit.def
rename to ANode/parser/test/data/good_defs/limit/limit.def
index 0d72623..f74349c 100644
--- a/AParser/test/data/good_defs/limit/limit.def
+++ b/ANode/parser/test/data/good_defs/limit/limit.def
@@ -1,14 +1,17 @@
-
 extern /limits:c1a
 extern /limits:linux_cluster
 extern /limits:pdb
 extern /limits:q2diss
-
 suite suiteName
 	limit sg1  10
 	limit mars 10
 endsuite
 
+suite s1
+	limit mars 10
+	limit sg1  10
+endsuite
+
 suite obs
     inlimit /limits:c1a
     family limits
@@ -19,6 +22,9 @@ suite obs
    		inlimit limits:hpcd       
     	task t1
     		inlimit /suiteName:sg1        # another suite limit
+    		inlimit /suiteName:mars       # another suite limit
+    		inlimit /s1:mars              # another suite limit
+    		inlimit /s1:sg1               # another suite limit
    		task t2
    			inlimit /obs/limits:hpcd      # This suite limit
   		task t3
diff --git a/AParser/test/data/good_defs/limit/limit2.def b/ANode/parser/test/data/good_defs/limit/limit2.def
similarity index 100%
rename from AParser/test/data/good_defs/limit/limit2.def
rename to ANode/parser/test/data/good_defs/limit/limit2.def
diff --git a/AParser/test/data/good_defs/limit/limit3.def b/ANode/parser/test/data/good_defs/limit/limit3.def
similarity index 100%
rename from AParser/test/data/good_defs/limit/limit3.def
rename to ANode/parser/test/data/good_defs/limit/limit3.def
diff --git a/AParser/test/data/good_defs/meter/negative.def b/ANode/parser/test/data/good_defs/meter/negative.def
similarity index 100%
rename from AParser/test/data/good_defs/meter/negative.def
rename to ANode/parser/test/data/good_defs/meter/negative.def
diff --git a/AParser/test/data/good_defs/meter/simple_meter.txt b/ANode/parser/test/data/good_defs/meter/simple_meter.txt
similarity index 100%
rename from AParser/test/data/good_defs/meter/simple_meter.txt
rename to ANode/parser/test/data/good_defs/meter/simple_meter.txt
diff --git a/AParser/test/data/good_defs/meter/spaces.def b/ANode/parser/test/data/good_defs/meter/spaces.def
similarity index 100%
rename from AParser/test/data/good_defs/meter/spaces.def
rename to ANode/parser/test/data/good_defs/meter/spaces.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_date.def b/ANode/parser/test/data/good_defs/repeat/repeat_date.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_date.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_date.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_day.def b/ANode/parser/test/data/good_defs/repeat/repeat_day.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_day.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_day.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_enumerate_quotes.def b/ANode/parser/test/data/good_defs/repeat/repeat_enumerate_quotes.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_enumerate_quotes.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_enumerate_quotes.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_enumerated.def b/ANode/parser/test/data/good_defs/repeat/repeat_enumerated.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_enumerated.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_enumerated.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_file.def b/ANode/parser/test/data/good_defs/repeat/repeat_file.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_file.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_file.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_integer.def b/ANode/parser/test/data/good_defs/repeat/repeat_integer.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_integer.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_integer.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_integer_1.def b/ANode/parser/test/data/good_defs/repeat/repeat_integer_1.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_integer_1.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_integer_1.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_integer_2.def b/ANode/parser/test/data/good_defs/repeat/repeat_integer_2.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_integer_2.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_integer_2.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_string.def b/ANode/parser/test/data/good_defs/repeat/repeat_string.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_string.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_string.def
diff --git a/AParser/test/data/good_defs/repeat/repeat_string_quotes.def b/ANode/parser/test/data/good_defs/repeat/repeat_string_quotes.def
similarity index 100%
rename from AParser/test/data/good_defs/repeat/repeat_string_quotes.def
rename to ANode/parser/test/data/good_defs/repeat/repeat_string_quotes.def
diff --git a/AParser/test/data/good_defs/suite/multi_statements_per_line.def b/ANode/parser/test/data/good_defs/suite/multi_statements_per_line.def
similarity index 100%
rename from AParser/test/data/good_defs/suite/multi_statements_per_line.def
rename to ANode/parser/test/data/good_defs/suite/multi_statements_per_line.def
diff --git a/AParser/test/data/good_defs/suite/multi_suite.def b/ANode/parser/test/data/good_defs/suite/multi_suite.def
similarity index 100%
rename from AParser/test/data/good_defs/suite/multi_suite.def
rename to ANode/parser/test/data/good_defs/suite/multi_suite.def
diff --git a/AParser/test/data/good_defs/suite/simple_suite.txt b/ANode/parser/test/data/good_defs/suite/simple_suite.txt
similarity index 100%
rename from AParser/test/data/good_defs/suite/simple_suite.txt
rename to ANode/parser/test/data/good_defs/suite/simple_suite.txt
diff --git a/AParser/test/data/good_defs/suite/suite_with_hierarchy.def b/ANode/parser/test/data/good_defs/suite/suite_with_hierarchy.def
similarity index 100%
rename from AParser/test/data/good_defs/suite/suite_with_hierarchy.def
rename to ANode/parser/test/data/good_defs/suite/suite_with_hierarchy.def
diff --git a/AParser/test/data/good_defs/suite/suite_with_task.def b/ANode/parser/test/data/good_defs/suite/suite_with_task.def
similarity index 100%
rename from AParser/test/data/good_defs/suite/suite_with_task.def
rename to ANode/parser/test/data/good_defs/suite/suite_with_task.def
diff --git a/AParser/test/data/good_defs/task/simple_task.txt b/ANode/parser/test/data/good_defs/task/simple_task.txt
similarity index 100%
rename from AParser/test/data/good_defs/task/simple_task.txt
rename to ANode/parser/test/data/good_defs/task/simple_task.txt
diff --git a/AParser/test/data/good_defs/task/spaces.def b/ANode/parser/test/data/good_defs/task/spaces.def
similarity index 100%
rename from AParser/test/data/good_defs/task/spaces.def
rename to ANode/parser/test/data/good_defs/task/spaces.def
diff --git a/AParser/test/data/good_defs/task/task.def b/ANode/parser/test/data/good_defs/task/task.def
similarity index 100%
rename from AParser/test/data/good_defs/task/task.def
rename to ANode/parser/test/data/good_defs/task/task.def
diff --git a/AParser/test/data/good_defs/time/time.def b/ANode/parser/test/data/good_defs/time/time.def
similarity index 100%
rename from AParser/test/data/good_defs/time/time.def
rename to ANode/parser/test/data/good_defs/time/time.def
diff --git a/AParser/test/data/good_defs/time/time_1.def b/ANode/parser/test/data/good_defs/time/time_1.def
similarity index 100%
rename from AParser/test/data/good_defs/time/time_1.def
rename to ANode/parser/test/data/good_defs/time/time_1.def
diff --git a/AParser/test/data/good_defs/time/time_2.def b/ANode/parser/test/data/good_defs/time/time_2.def
similarity index 100%
rename from AParser/test/data/good_defs/time/time_2.def
rename to ANode/parser/test/data/good_defs/time/time_2.def
diff --git a/AParser/test/data/good_defs/today/today.def b/ANode/parser/test/data/good_defs/today/today.def
similarity index 100%
rename from AParser/test/data/good_defs/today/today.def
rename to ANode/parser/test/data/good_defs/today/today.def
diff --git a/AParser/test/data/good_defs/today/today1.def b/ANode/parser/test/data/good_defs/today/today1.def
similarity index 100%
rename from AParser/test/data/good_defs/today/today1.def
rename to ANode/parser/test/data/good_defs/today/today1.def
diff --git a/AParser/test/data/good_defs/trigger/ECFLOW_867.def b/ANode/parser/test/data/good_defs/trigger/ECFLOW_867.def
similarity index 100%
rename from AParser/test/data/good_defs/trigger/ECFLOW_867.def
rename to ANode/parser/test/data/good_defs/trigger/ECFLOW_867.def
diff --git a/ANode/parser/test/data/good_defs/trigger/all_trigger_examples.def b/ANode/parser/test/data/good_defs/trigger/all_trigger_examples.def
new file mode 100644
index 0000000..afad135
--- /dev/null
+++ b/ANode/parser/test/data/good_defs/trigger/all_trigger_examples.def
@@ -0,0 +1,59 @@
+suite all_trigger_examples
+   limit top_level_limit 20
+   task a
+      event EVENT
+      meter METER 1 100 50
+      edit  VAR_DATE 20170701
+      edit  VAR_STRING "captain scarlett"      # This is not convertible to an integer, if referenced will use '0'
+      late -c +02:00                           # add late flag if task takes longer than 2 hours to complete
+  family f1
+      edit SLEEP 2
+      repeat string NAME a b c d e f              # This has values: a(0),b(1), c(3), d(4), e(5), f(6) i.e. index
+      family f2
+         repeat integer VALUE 5 10                # This has values: 5,6,7,8,9,10
+         family f3
+            repeat enumerated red green blue      # red(0), green(1), blue(2)
+            task t1
+               repeat date DATE 19991230 20000102  # This has values: 19991230,19991231,20000101,20000102
+               trigger :VALUE == 5 and :NAME == 0 and :SLEEP == 2 # references f2:VALUE,f1:NAME,f1:SLEEP new for 4.7.0 release
+         endfamily
+      endfamily
+   endfamily
+   family f2
+      inlimit /all_trigger_examples:top_level_limit
+      task event_meter
+          trigger /all_trigger_examples/a:EVENT == set and /all_trigger_examples/a:METER >= 30
+      task variable
+          trigger /all_trigger_examples/a:VAR_DATE >= 20170801 and /all_trigger_examples/a:VAR_STRING == 0
+      task repeat_string
+          trigger /all_trigger_examples/f1:NAME >= 4
+      task repeat_integer
+          trigger /all_trigger_examples/f1/f2:VALUE >= 7
+      task repeat_date
+          trigger /all_trigger_examples/f1/f2/f3/t1:DATE >= 19991231
+      task repeat_date_arithmitic
+          # Using plus/minus on a repeat DATE will use date arithmetic
+          # Since the starting value of DATE is 19991230, this task will run
+          # straight away
+          trigger /all_trigger_examples/f1/f2/f3/t1:DATE - 1 == 19991229
+      task use_repeat_date_yyyy
+          trigger /all_trigger_examples/f1/f2/f3/t1:DATE_YYYY == 2000    # DATE_YYYY(year)is a generated variable for repeat date DATE 19991230 20000102
+      task use_repeat_date_generated_mm
+          trigger /all_trigger_examples/f1/f2/f3/t1:DATE_MM == 2         # DATE_MM(month) is a generated variable for repeat date DATE 19991230 20000102
+      task use_repeat_date_generated_dd
+          trigger /all_trigger_examples/f1/f2/f3/t1:DATE_DD == 30        # DATE_DD(day of the month) is a generated variable for repeat date DATE 19991230 20000102
+      task use_repeat_date_generated_dow
+          trigger /all_trigger_examples/f1/f2/f3/t1:DATE_DOW == 0        # DATE_MM(day of week, 0-sunday,1-monday,etc) is a generated variable for repeat date DATE 19991230 20000102
+      task use_repeat_date_generated_julian
+          trigger /all_trigger_examples/f1/f2/f3/t1:DATE_JULIAN > cal::date_to_julian(/all_trigger_examples/a:VAR_DATE)  # DATE_JULIAN(the julian of the date) is a generated variable for repeat date DATE 19991230 20000102
+      task with_trigger_that_ref_a_limit
+          trigger /all_trigger_examples:top_level_limit < 5        # low priority task, only valid when system is not loaded
+      task trigger_with_ref_to_late_flag
+          trigger /all_trigger_examples/a<flag>late                # Only triggers if task /all_trigger_examples/a is late
+   endfamily
+   family time_trigger
+      trigger /all_trigger_examples:DOW == 0  or /all_trigger_examples:DOW == 1   # DOW is a generated variable on the suite representing DAY of the week. i.e Sundày and Monday in this case
+      task with_time
+         trigger /all_trigger_examples:TIME > 1330                 # TIME is a generated variable on the suite , same as time > 13:30
+   endfamily
+ endsuite
\ No newline at end of file
diff --git a/AParser/test/data/good_defs/trigger/anded_ored.def b/ANode/parser/test/data/good_defs/trigger/anded_ored.def
similarity index 100%
rename from AParser/test/data/good_defs/trigger/anded_ored.def
rename to ANode/parser/test/data/good_defs/trigger/anded_ored.def
diff --git a/AParser/test/data/good_defs/trigger/complex_hier.def b/ANode/parser/test/data/good_defs/trigger/complex_hier.def
similarity index 68%
rename from AParser/test/data/good_defs/trigger/complex_hier.def
rename to ANode/parser/test/data/good_defs/trigger/complex_hier.def
index 05a3602..e98ee35 100644
--- a/AParser/test/data/good_defs/trigger/complex_hier.def
+++ b/ANode/parser/test/data/good_defs/trigger/complex_hier.def
@@ -1,4 +1,7 @@
 # test node referencing in triggers
+#      o/ <node> == complete    i.e   a == complete   can mean sibling or parent node  # confusing
+#      o/ ./<node> == complete  i.e  ./a == complete  can mean sibling or parent node 
+#      o/ ../<node> == complete i.e  ../a == complete means current nodes parents parent
 suite s1
   family f1
      family f2
@@ -7,6 +10,8 @@ suite s1
               task a
                  event 1 theEventName
                  meter myMeter 0 100
+                 trigger f4 == complete or ./bb == complete or ../f3 == complete  # f4 immediate parent and bb is sibling ../f3 is parents parent
+               task bb
             endfamily   
          endfamily
       endfamily
diff --git a/AParser/test/data/good_defs/trigger/complex_trigger.txt b/ANode/parser/test/data/good_defs/trigger/complex_trigger.txt
similarity index 92%
rename from AParser/test/data/good_defs/trigger/complex_trigger.txt
rename to ANode/parser/test/data/good_defs/trigger/complex_trigger.txt
index 12dc550..91d6304 100644
--- a/AParser/test/data/good_defs/trigger/complex_trigger.txt
+++ b/ANode/parser/test/data/good_defs/trigger/complex_trigger.txt
@@ -3,6 +3,7 @@ extern /a/b/c/d/e:event
 extern /a/b/c/d/e:meter        
 
 suite suiteName
+  edit int_var 20
   family familyName
    		task a
         	event 1 theEventName
@@ -17,6 +18,9 @@ suite suiteName
    endfamily
    family familyName1
    		trigger familyName == complete                      # this is a comment
+        repeat date YMD 20090331 20121212 1 # status 0
+        task ref_parent_var_without_path
+        	trigger :YMD < 20121212 and :int_var < 40
    		task a
          	event 1 theEventName
          	event aEvent
diff --git a/AParser/test/data/good_defs/trigger/extension.def b/ANode/parser/test/data/good_defs/trigger/extension.def
similarity index 100%
rename from AParser/test/data/good_defs/trigger/extension.def
rename to ANode/parser/test/data/good_defs/trigger/extension.def
diff --git a/AParser/test/data/good_defs/trigger/late.def b/ANode/parser/test/data/good_defs/trigger/late.def
similarity index 100%
rename from AParser/test/data/good_defs/trigger/late.def
rename to ANode/parser/test/data/good_defs/trigger/late.def
diff --git a/AParser/test/data/good_defs/trigger/limit.def b/ANode/parser/test/data/good_defs/trigger/limit.def
similarity index 100%
rename from AParser/test/data/good_defs/trigger/limit.def
rename to ANode/parser/test/data/good_defs/trigger/limit.def
diff --git a/AParser/test/data/good_defs/trigger/simple_trigger.txt b/ANode/parser/test/data/good_defs/trigger/simple_trigger.txt
similarity index 100%
rename from AParser/test/data/good_defs/trigger/simple_trigger.txt
rename to ANode/parser/test/data/good_defs/trigger/simple_trigger.txt
diff --git a/AParser/test/data/good_defs/trigger/trigger_references.def b/ANode/parser/test/data/good_defs/trigger/trigger_references.def
similarity index 100%
rename from AParser/test/data/good_defs/trigger/trigger_references.def
rename to ANode/parser/test/data/good_defs/trigger/trigger_references.def
diff --git a/AParser/test/data/good_defs/variable/alias.def b/ANode/parser/test/data/good_defs/variable/alias.def
similarity index 100%
rename from AParser/test/data/good_defs/variable/alias.def
rename to ANode/parser/test/data/good_defs/variable/alias.def
diff --git a/AParser/test/data/good_defs/variable/duplicate.def b/ANode/parser/test/data/good_defs/variable/duplicate.def
similarity index 100%
rename from AParser/test/data/good_defs/variable/duplicate.def
rename to ANode/parser/test/data/good_defs/variable/duplicate.def
diff --git a/AParser/test/data/good_defs/variable/variable.txt b/ANode/parser/test/data/good_defs/variable/variable.txt
similarity index 100%
rename from AParser/test/data/good_defs/variable/variable.txt
rename to ANode/parser/test/data/good_defs/variable/variable.txt
diff --git a/AParser/test/data/good_defs/verify/verify.def b/ANode/parser/test/data/good_defs/verify/verify.def
similarity index 100%
rename from AParser/test/data/good_defs/verify/verify.def
rename to ANode/parser/test/data/good_defs/verify/verify.def
diff --git a/AParser/test/data/good_defs/zombie/zombie.def b/ANode/parser/test/data/good_defs/zombie/zombie.def
similarity index 100%
rename from AParser/test/data/good_defs/zombie/zombie.def
rename to ANode/parser/test/data/good_defs/zombie/zombie.def
diff --git a/AParser/test/data/good_defs_state/defs/defs_state.def b/ANode/parser/test/data/good_defs_state/defs/defs_state.def
similarity index 100%
rename from AParser/test/data/good_defs_state/defs/defs_state.def
rename to ANode/parser/test/data/good_defs_state/defs/defs_state.def
diff --git a/ANode/parser/test/data/good_node_defs/family/family.def b/ANode/parser/test/data/good_node_defs/family/family.def
new file mode 100644
index 0000000..add8b0c
--- /dev/null
+++ b/ANode/parser/test/data/good_node_defs/family/family.def
@@ -0,0 +1,11 @@
+family test_local_actions # state:queued suspended:1
+   defstatus suspended
+   edit REMOTE_HOST 'eurydice'
+   edit WORKDIR ''
+   task action1 # state:queued suspended:1
+	  defstatus suspended
+   family f1 # state:queued suspended:1
+	  task a # state:queued suspended:1
+	  task b # state:queued suspended:1
+   endfamily
+endfamily
\ No newline at end of file
diff --git a/ANode/parser/test/data/good_node_defs/suite/suite.def b/ANode/parser/test/data/good_node_defs/suite/suite.def
new file mode 100644
index 0000000..e9ab38c
--- /dev/null
+++ b/ANode/parser/test/data/good_node_defs/suite/suite.def
@@ -0,0 +1,17 @@
+# 
+suite suite #  begun:1 state:queued suspended:1
+	defstatus suspended
+	edit ECF_HOME '/scratch/ma/ma0/nightly'
+	task exp # state:queued
+		edit ECF_JOB_CMD 'python %ECF_JOB% 1> %ECF_JOBOUT% 2>&1'
+		label label_name "value"
+		meter meter 0 100 100
+		event event_fred
+	family test_local_actions # state:queued suspended:1
+		defstatus suspended
+		edit REMOTE_HOST 'eurydice'
+		edit WORKDIR ''
+		task action1 # state:queued suspended:1
+			defstatus suspended
+	endfamily
+endsuite
\ No newline at end of file
diff --git a/ANode/parser/test/data/good_node_defs/task/task.def b/ANode/parser/test/data/good_node_defs/task/task.def
new file mode 100644
index 0000000..1bbf2c4
--- /dev/null
+++ b/ANode/parser/test/data/good_node_defs/task/task.def
@@ -0,0 +1,6 @@
+task exp # state:queued
+  edit ECF_JOB_CMD 'python %ECF_JOB% 1> %ECF_JOBOUT% 2>&1'
+  label label_name "value"
+  meter meter 0 100 100
+  event event_fred
+  trigger 1 == 1
\ No newline at end of file
diff --git a/AParser/test/data/single_defs/ECFLOW-417.def b/ANode/parser/test/data/single_defs/ECFLOW-417.def
similarity index 100%
rename from AParser/test/data/single_defs/ECFLOW-417.def
rename to ANode/parser/test/data/single_defs/ECFLOW-417.def
diff --git a/AParser/test/data/single_defs/ealadin.def b/ANode/parser/test/data/single_defs/ealadin.def
similarity index 100%
rename from AParser/test/data/single_defs/ealadin.def
rename to ANode/parser/test/data/single_defs/ealadin.def
diff --git a/AParser/test/data/single_defs/mega.def b/ANode/parser/test/data/single_defs/mega.def
similarity index 100%
rename from AParser/test/data/single_defs/mega.def
rename to ANode/parser/test/data/single_defs/mega.def
diff --git a/AParser/test/data/single_defs/test_auto_add_extern.def b/ANode/parser/test/data/single_defs/test_auto_add_extern.def
similarity index 100%
rename from AParser/test/data/single_defs/test_auto_add_extern.def
rename to ANode/parser/test/data/single_defs/test_auto_add_extern.def
diff --git a/AParser/test/data/single_defs/test_complete.def b/ANode/parser/test/data/single_defs/test_complete.def
similarity index 100%
rename from AParser/test/data/single_defs/test_complete.def
rename to ANode/parser/test/data/single_defs/test_complete.def
diff --git a/AParser/test/data/single_defs/test_repeat.def b/ANode/parser/test/data/single_defs/test_repeat.def
similarity index 100%
rename from AParser/test/data/single_defs/test_repeat.def
rename to ANode/parser/test/data/single_defs/test_repeat.def
diff --git a/ANode/src/Defs.cpp b/ANode/src/Defs.cpp
index cdab6aa..6551140 100644
--- a/ANode/src/Defs.cpp
+++ b/ANode/src/Defs.cpp
@@ -23,7 +23,6 @@
 #include "Family.hpp"
 #include "Task.hpp"
 #include "Log.hpp"
-#include "PrintStyle.hpp"
 #include "NodeTreeVisitor.hpp"
 #include "Str.hpp"
 #include "Extract.hpp"
@@ -42,6 +41,8 @@
 #include "AbstractObserver.hpp"
 #include "CheckPtContext.hpp"
 #include "SuiteChanged.hpp"
+#include "DefsStructureParser.hpp" /// The reason why Parser code moved into Defs, avoid cyclic dependency
+#include "File.hpp"  
 
 using namespace ecf;
 using namespace std;
@@ -58,6 +59,17 @@ Defs::Defs() :
    client_suite_mgr_(this),
    in_notification_(false) {}
 
+Defs::Defs(const std::string& port) :
+   state_change_no_(0),
+   modify_change_no_( 0 ),
+   updateCalendarCount_(0),
+   order_state_change_no_(0),
+   server_(port),
+   save_edit_history_(false),
+   client_suite_mgr_(this),
+   in_notification_(false) {}
+
+
 Defs::Defs(const Defs& rhs) :
    state_change_no_(0),
    modify_change_no_( 0 ),
@@ -127,10 +139,8 @@ Defs& Defs::operator=(const Defs& rhs)
    return *this;
 }
 
-defs_ptr Defs::create()
-{
-	return boost::make_shared<Defs>();
-}
+defs_ptr Defs::create() { return boost::make_shared<Defs>();}
+defs_ptr Defs::create(const std::string& port) { return boost::make_shared<Defs>(port);} // Defs::create(port)
 
 Defs::~Defs()
 {
@@ -576,29 +586,29 @@ bool Defs::hasTimeDependencies() const
 std::ostream& Defs::print(std::ostream& os) const
 {
    os << "# " << ecf::Version::raw() << "\n";
-	if (!PrintStyle::defsStyle()) {
-	   os << write_state();
-	}
-	if (PrintStyle::getStyle() == PrintStyle::STATE) {
-	   os << "# server variable\n";
-	   const std::vector<Variable>& server_variables = server().server_variables();
-	   BOOST_FOREACH(const Variable& var, server_variables) { var.print_generated(os);}
-      os << "# user variable\n";
-      const std::vector<Variable>& user_variables = server().user_variables();
-      BOOST_FOREACH(const Variable& var, user_variables) { var.print_generated(os);}
-	}
+   if (!PrintStyle::defsStyle()) {
+      os << write_state();
+   }
+   if (PrintStyle::getStyle() == PrintStyle::STATE) {
+      os << "# server state: " << SState::to_string(server().get_state()) << "\n";
+   }
 
-	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;
+   // In PrintStyle::MIGRATE we do NOT persist the externs. (+matches boost serialisation)
+   if (PrintStyle::getStyle() != PrintStyle::MIGRATE) {
+      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
@@ -616,11 +626,15 @@ std::string Defs::write_state() const
    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);
-   }
+   // This read by the DefsParser
+   const std::vector<Variable>& server_user_variables = server().user_variables();
+   size_t the_size = server_user_variables.size();
+   for(size_t i = 0; i < the_size; ++i)  server_user_variables[i].print(os);
+
+   const std::vector<Variable>& server_variables = server().server_variables();
+   the_size = server_variables.size();
+   for(size_t i = 0; i < the_size; ++i)  server_variables[i].print_server_variable(os); // edit var value # server
+
 
    // READ by Defs::read_history()
    // We need to define a separator for the message, will to allow it to be re-read
@@ -631,7 +645,7 @@ std::string Defs::write_state() const
    // [] Used in time
    // integers used in the time.
    // -  Used in commands
-   if (PrintStyle::getStyle() == PrintStyle::MIGRATE || save_edit_history_) {
+   if (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) {
@@ -711,6 +725,26 @@ bool Defs::compare_edit_history(const Defs& rhs) const
    return true;
 }
 
+bool Defs::compare_change_no(const Defs& rhs) const
+{
+   if ( state_change_no_ != rhs.state_change_no_ ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Defs::compare_change_no: state_change_no_(" << state_change_no_  << ") != rhs.state_change_no_(" <<  rhs.state_change_no_ << ")\n";
+      }
+#endif
+      return false;
+   }
+   if ( modify_change_no_ != rhs.modify_change_no_  ) {
+#ifdef DEBUG
+      if (Ecf::debug_equality()) {
+         std::cout << "Defs::compare_change_no: modify_change_no_(" << modify_change_no_ << ") != rhs.modify_change_no_(" << rhs.modify_change_no_ << ")\n";
+      }
+#endif
+      return false;
+   }
+   return true;
+}
 
 bool Defs::operator==(const Defs& rhs) const
 {
@@ -1087,7 +1121,7 @@ node_ptr Defs::replaceChild(const std::string& path,
 	return client_node_to_add;
 }
 
-void Defs::save_as_checkpt(const std::string& the_fileName,ecf::Archive::Type at) const
+void Defs::boost_save_as_checkpt(const std::string& the_fileName,ecf::Archive::Type at) const
 {
    // Save NodeContainer children even if ecf::Flag::MIGRATED set
    CheckPtContext checkpt_context;
@@ -1099,58 +1133,121 @@ void Defs::save_as_checkpt(const std::string& the_fileName,ecf::Archive::Type at
  	ecf::save(the_fileName,*this,at);
 }
 
-void Defs::save_checkpt_as_string(std::string& output) const
+void Defs::boost_save_as_filename(const std::string& the_fileName,ecf::Archive::Type at) const
 {
-   // Save NodeContainer children even if ecf::Flag::MIGRATED set
-   CheckPtContext checkpt_context;
+   /// Can throw archive exception
+   ecf::save(the_fileName,*this,at);
+}
+
+
+void Defs::boost_restore_from_checkpt(const std::string& the_fileName,ecf::Archive::Type at)
+{
+//	cout << "Defs::boost_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);
+
+//	cout << "Restored: " << suiteVec_.size() << " suites\n";
+}
+
+void Defs::save_as_checkpt(const std::string& the_fileName) const
+{
+   // Save as defs will always save children, hence no need for CheckPtContext
 
    // 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);
+   // Speed up check-pointing by avoiding indentation. i.e run_time and disk space
+   // to view indented code use 'ecflow_client --load=checkpt_file check_only print'
+   ecf::DisableIndentor disable_indentation;
+   save_as_filename(the_fileName,PrintStyle::MIGRATE);
 }
 
-void Defs::save_as_filename(const std::string& the_fileName,ecf::Archive::Type at) const
+void Defs::save_as_filename(const std::string& the_fileName,PrintStyle::Type_t p_style) const
 {
-   /// Can throw archive exception
-   ecf::save(the_fileName,*this,at);
+   PrintStyle printStyle(p_style);
+
+   std::ofstream ofs( the_fileName.c_str() );
+   ofs << this;
+
+   if (!ofs.good()) {
+      std::stringstream ss; ss << "Defs::save_as_filename: path(" << the_fileName << ") failed";
+      throw std::runtime_error(ss.str());
+   }
 }
 
-void Defs::save_as_string(std::string& output) const
+void Defs::save_as_string(std::string& the_string,PrintStyle::Type_t p_style) const
 {
-   ecf::save_as_string(output,*this);
+   PrintStyle printStyle(p_style);
+
+   // Speed up check-pointing by avoiding indentation. i.e run_time and disk space
+   // to view indented code use 'ecflow_client --load=checkpt_file check_only print'
+   ecf::DisableIndentor disable_indentation;
+   std::stringstream ss;
+   ss << this;
+   the_string = ss.str();
 }
 
-void Defs::restore_from_checkpt(const std::string& the_fileName,ecf::Archive::Type at)
+void Defs::restore(const std::string& the_fileName)
 {
-//	cout << "Defs::restore_from_checkpt " << the_fileName << "\n";
+   if (the_fileName.empty())  return;
 
-	if (the_fileName.empty())  return;
+   /// *************************************************************************
+   /// The reason why Parser code moved to ANode directory. Avoid cyclic loop
+   /// *************************************************************************
+   std::string errorMsg,warningMsg;
+   if (!restore(the_fileName,errorMsg,warningMsg)) {
+      std::stringstream e; e << "Defs::defs_restore_from_checkpt: " << errorMsg;
+      throw std::runtime_error(e.str());
+   }
+}
 
-	// deleting existing content first. *** Note: Server environment left as is ****
-	clear();
+bool Defs::restore(const std::string& the_fileName,std::string& errorMsg, std::string& warningMsg)
+{
+   if (the_fileName.empty()) {
+      errorMsg = "Defs::restore: the filename string is empty";
+      return false;
+   }
 
-	ecf::restore(the_fileName, (*this), at);
+   // deleting existing content first. *** Note: Server environment left as is ****
+   clear();
 
-	// Reset the state and modify numbers, **After the restore**
-   state_change_no_ = Ecf::state_change_no();
-   modify_change_no_ = Ecf::modify_change_no();
+   DefsStructureParser parser( this, the_fileName );
+   bool ret = parser.doParse(errorMsg,warningMsg);
+   return ret;
+}
 
-//	cout << "Restored: " << suiteVec_.size() << " suites\n";
+void Defs::restore_from_string(const std::string& str)
+{
+   /// *************************************************************************
+   /// The reason why Parser code moved to ANode directory. Avoid cyclic loop
+   /// *************************************************************************
+   std::string errorMsg,warningMsg;
+   if (!restore_from_string(str,errorMsg,warningMsg)) {
+      std::stringstream e; e << "Defs::defs_restore_from_string: " << errorMsg;
+      throw std::runtime_error(e.str());
+   }
 }
 
-void Defs::restore_from_string(const std::string& rest)
+bool Defs::restore_from_string(const std::string& str,std::string& errorMsg, std::string& warningMsg)
 {
-   if (rest.empty()) return;
+   if (str.empty()) {
+      errorMsg = "Defs::restore_from_string: the string is empty";
+      return false;
+   }
 
    // deleting existing content first. *** Note: Server environment left as is ****
    clear();
 
-   ecf::restore_from_string(rest,*this);
-
-   // Reset the state and modify numbers, **After the restore**
-   state_change_no_ = Ecf::state_change_no();
-   modify_change_no_ = Ecf::modify_change_no();
+   // Do *NOT* Reset the state and modify numbers
+   // As we we need this numbers for Syncing between client<->Server
+   DefsStructureParser parser( this, str, false/* not used*/ );
+   bool ret = parser.doParse(errorMsg,warningMsg);
+   return ret;
 }
 
 void Defs::clear()
@@ -1179,6 +1276,19 @@ bool Defs::checkInvariants(std::string& errorMsg) const
 			errorMsg += ss.str();
 			return false;
 		}
+      if (!suiteVec_[s]->isSuite() ) {
+          std::stringstream ss;
+          ss << "Defs::checkInvariants suite isSuite() return NULL ? for suite " << suiteVec_[s]->name();
+          errorMsg += ss.str();
+          return false;
+      }
+		if (suiteVec_[s]->isSuite() != suiteVec_[s]->suite()) {
+         std::stringstream ss;
+         ss << "Defs::checkInvariants  suiteVec_[s]->isSuite(" << suiteVec_[s]->isSuite() << ") != suiteVec_[s]->suite(" << suiteVec_[s]->suite() << ") ";
+         ss << "for suite " << suiteVec_[s]->name();
+         errorMsg += ss.str();
+         return false;
+		}
 		if (!suiteVec_[s]->checkInvariants(errorMsg)) {
 			return false;
 		}
diff --git a/ANode/src/Defs.hpp b/ANode/src/Defs.hpp
index 218bdc4..55043b6 100644
--- a/ANode/src/Defs.hpp
+++ b/ANode/src/Defs.hpp
@@ -46,6 +46,7 @@
 #include "CheckPt.hpp"
 #include "Archive.hpp"
 #include "Attr.hpp"
+#include "PrintStyle.hpp"
 
 class Limit;
 class AbstractObserver;
@@ -54,7 +55,9 @@ namespace ecf { class NodeTreeVisitor; class CalendarUpdateParams; } // forward
 class Defs {
 public:
    static defs_ptr create();
+   static defs_ptr create(const std::string& port);
    Defs();
+   Defs(const std::string& port); // used in test, to initialise server variables
    Defs(const Defs&);
    Defs& operator=(const Defs&);
 
@@ -143,6 +146,7 @@ public:
    ///  extern /suite/family:repeat_name
    ///  extern ../family:repeat_name
    void add_extern(const std::string& nodePath );
+   void clear_externs() { externs_.clear();}
 
    /// 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,
@@ -248,19 +252,20 @@ public:
    void top_down_why(std::vector<std::string>& theReasonWhy,bool html_tags = false) const;
    bool why(std::vector<std::string>& theReasonWhy,bool html_tags = false) const; // return true if why found
 
-   /// 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;
-
-   void save_as_filename(const std::string& fileName,ecf::Archive::Type = ecf::Archive::default_archive()) const;
-   void save_as_string(std::string&) 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());
-   void restore_from_string(const std::string& );
+   /// Function to save/restore the defs as a checkpoint file. Can throw exception
+   /// If the Defs file has content, this is deleted first, i.e. suites, externs, Can throw an exception
+   void boost_save_as_checkpt(const std::string& fileName,ecf::Archive::Type = ecf::Archive::default_archive()) const;
+   void boost_save_as_filename(const std::string& fileName,ecf::Archive::Type = ecf::Archive::default_archive()) const; // used in test only
+   void boost_restore_from_checkpt(const std::string& fileName,ecf::Archive::Type = ecf::Archive::default_archive());
+
+   // defs format
+   void save_as_checkpt(const std::string& fileName) const;
+   void save_as_filename(const std::string& fileName,PrintStyle::Type_t = PrintStyle::MIGRATE) const; // used in test only
+   void save_as_string(std::string& str,PrintStyle::Type_t = PrintStyle::MIGRATE) const;
+   void restore(const std::string& fileName); // will throw
+   bool restore(const std::string& fileName,std::string& errorMsg, std::string& warningMsg);
+   void restore_from_string(const std::string& str); // will throw
+   bool restore_from_string(const std::string& str,std::string& errorMsg, std::string& warningMsg);
 
    /// Delete suites, externs, client handles, reset suspended, and locate state
    /// etc but Server environment left as is:
@@ -308,6 +313,7 @@ public:
    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;
+   bool compare_change_no(const Defs&) const;
 private:
    void do_generate_scripts( const std::map<std::string,std::string>& override) const;
    std::string write_state() const;
diff --git a/ANode/src/EcfFile.hpp b/ANode/src/EcfFile.hpp
index cc8c7c7..8a343ee 100644
--- a/ANode/src/EcfFile.hpp
+++ b/ANode/src/EcfFile.hpp
@@ -58,7 +58,7 @@ public:
 
 	/// use default copy constructor, assignment, destructor
 	/// ECF_FETCH  is used obtain the script from running a command  i.e.
-	/// from the version control system. This has not been implemented yet.
+	/// from the version control system.
 	EcfFile(Node*, const std::string& path_to_script_or_fetch_cmd, EcfFile::ScriptType = ECF_FILE );
 
 	// The path to the ecf file, empty path means that ecf file could not be located
diff --git a/ANode/src/ExprAst.cpp b/ANode/src/ExprAst.cpp
index b8df403..0f669d9 100644
--- a/ANode/src/ExprAst.cpp
+++ b/ANode/src/ExprAst.cpp
@@ -443,7 +443,7 @@ AstDivide* AstDivide::clone() const
 bool AstDivide::check(std::string& error_msg) const
 {
    if (right_ && right_->value() == 0) {
-      error_msg = "Error: Divide by zero in trigger expression";
+      error_msg += " Error: Divide by zero in trigger expression";
       return false;
    }
    return true;
@@ -564,7 +564,7 @@ AstModulo* AstModulo::clone() const
 bool AstModulo::check(std::string& error_msg) const
 {
    if (right_ && right_->value() == 0) {
-      error_msg = "Error: Modulo by zero in trigger expression";
+      error_msg += " Error: Modulo by zero in trigger expression";
       return false;
    }
    return true;
@@ -1579,6 +1579,121 @@ Node* AstVariable::referencedNode(std::string& errorMsg) const
 	return NULL;
 }
 
+////////////////////////////////////////////////////////////////////////////////////
+
+Node* AstParentVariable::find_node_which_references_variable() const
+{
+   Node* parent = parentNode_;
+   while (parent) {
+      if ( parent->findExprVariable(name_)) return parent;
+      parent = parent->parent();
+   }
+   return NULL;
+}
+
+void AstParentVariable::accept(ExprAstVisitor& v)
+{
+   v.visitParentVariable(this);  // Not calling base
+}
+
+AstParentVariable* AstParentVariable::clone() const
+{
+   return new AstParentVariable(name_);
+}
+
+int AstParentVariable::value() const
+{
+   Node* ref_node = find_node_which_references_variable();
+   if (ref_node) {
+      return ref_node->findExprVariableValue(name_);
+   }
+   return 0;
+}
+
+int AstParentVariable::minus(Ast* right) const
+{
+   Node* ref_node = find_node_which_references_variable();
+   if (ref_node) {
+      return ref_node->findExprVariableValueAndMinus(name_,right->value());
+   }
+   return right->value();
+}
+
+int AstParentVariable::plus(Ast* right) const
+{
+   Node* ref_node = find_node_which_references_variable();
+   if (ref_node) {
+      return ref_node->findExprVariableValueAndPlus(name_,right->value());
+   }
+   return right->value();
+}
+
+std::ostream& AstParentVariable::print( std::ostream& os ) const
+{
+   Indentor in;
+   Indentor::indent( os ) << "# " << Str::COLON() << name_;
+
+   Node* ref_node = find_node_which_references_variable();
+   if (ref_node) {
+      os << " (";
+      ref_node->findExprVariableAndPrint(name_, os);
+      os << ")";
+      os << "\n";
+      return os;
+   }
+   os << " referencedNode(NULL) value(0)";
+   os << "\n";
+   return os;
+}
+
+void AstParentVariable::print_flat(std::ostream& os,bool /*add_bracket*/) const
+{
+   os << Str::COLON() << name_;
+}
+
+std::string AstParentVariable::expression() const
+{
+   return Str::COLON() + name_;
+}
+
+std::string AstParentVariable::why_expression(bool html) const
+{
+   std::string varType = "variable-not-found";
+   int theValue=0;
+   std::string ret;
+   Node* ref_node = find_node_which_references_variable();
+   if (ref_node) {
+      theValue = ref_node ->findExprVariableValueAndType( name_, varType );
+   }
+   if (html) {
+      // ecflow_ui expects: [attribute_type]attribute_path:attribute_name
+      // i.e                [limit]/suite/family/task:my_limit
+      std::stringstream display_ss; display_ss << "[" << varType << "]" << ":" << name_;
+      std::string display_str = display_ss.str();
+      std::string ref_str;
+      if (ref_node) {
+         std::stringstream ref_ss; ref_ss << "[" << varType << "]" << ref_node->absNodePath() << ":" << name_;
+         ref_str = ref_ss.str();
+      }
+      else ref_str = display_str;
+
+      ret = Node::path_href_attribute(ref_str,display_str);
+      if ( !ref_node )  ret += "(?)";
+      ret += "(";
+      ret += boost::lexical_cast<std::string>(theValue);
+      ret += ")";
+   }
+   else {
+      if ( !ref_node )  ret += "(?)";
+      ret += Str::COLON();
+      ret += name_;
+      ret += "(";
+      std::stringstream ss; ss << "type:" << varType << " value:" << theValue;
+      ret += ss.str();
+      ret += ")";
+   }
+   return ret;
+}
 
 // ===============================================================================
 // class VariableHelper:
diff --git a/ANode/src/ExprAst.hpp b/ANode/src/ExprAst.hpp
index 60b5ad4..8b9230d 100644
--- a/ANode/src/ExprAst.hpp
+++ b/ANode/src/ExprAst.hpp
@@ -585,6 +585,53 @@ private:
 	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
+/// ** IT is treated in a same as an integer, and can appear in that context
+//  ** i.e  "2 == (((:YMD / 100 ) % 100) % 3"
+class AstParentVariable : public AstLeaf {
+public:
+   AstParentVariable(const std::string& variablename)
+   : parentNode_(NULL), name_(variablename)  {}
+
+   virtual std::string name() const { return name_;}
+   virtual bool is_attribute() const { return true; }
+
+   // although  AstParentVariable is leaf, However allow to evaluate to cope with
+   //     ( :myMeter >= 20 and :myEvent)
+   // Treat this like an integer
+   virtual bool is_evaluateable() const { return true; }
+   virtual bool evaluate() const { return value() != 0 ? true: false; }
+
+   virtual void accept(ecf::ExprAstVisitor&);
+   virtual AstParentVariable* 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() const;
+   virtual std::string why_expression(bool html = 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_; }
+   static std::string stype() { return "parent_variable";}
+
+   Node* find_node_which_references_variable() const;
+   Node* referencedNode() const { return find_node_which_references_variable();}
+
+private:
+   Node* parentNode_;
+   std::string name_;
+   mutable weak_node_ptr ref_node_;
+};
+
 // Helper class
 class VariableHelper : private boost::noncopyable {
 public:
diff --git a/ANode/src/ExprAstVisitor.cpp b/ANode/src/ExprAstVisitor.cpp
index ffc9948..4d3cd2c 100644
--- a/ANode/src/ExprAstVisitor.cpp
+++ b/ANode/src/ExprAstVisitor.cpp
@@ -54,6 +54,21 @@ void AstResolveVisitor::visitVariable(AstVariable* astVar)
  	}
 }
 
+void AstResolveVisitor::visitParentVariable(AstParentVariable* astvar)
+{
+   if ( errorMsg_.empty() ) {
+
+      astvar->setParentNode(const_cast<Node*>(triggerNode_));
+
+      if (!astvar->find_node_which_references_variable()) {
+         std::stringstream ss;
+         ss << " Could not find variable " << astvar->name()
+                  << " on node " << triggerNode_->debugNodePath() << " OR any of its parent nodes";
+         errorMsg_ += ss.str();
+      }
+   }
+}
+
 void AstResolveVisitor::visitFlag(AstFlag* ast)
 {
    if (  errorMsg_.empty()) {
@@ -85,6 +100,12 @@ void AstCollateNodesVisitor::visitVariable(AstVariable* astVar)
 	if ( referencedNode ) theSet_.insert(referencedNode);
 }
 
+void AstCollateNodesVisitor::visitParentVariable(AstParentVariable* astvar)
+{
+   Node* referencedNode = astvar->referencedNode(); // could be expensive, hence don't call twice
+   if ( referencedNode ) theSet_.insert(referencedNode);
+}
+
 void AstCollateNodesVisitor::visitFlag(AstFlag* ast)
 {
    Node* referencedNode = ast->referencedNode(); // could be expensive, hence don't call twice
diff --git a/ANode/src/ExprAstVisitor.hpp b/ANode/src/ExprAstVisitor.hpp
index 357cb0f..dbc07ec 100644
--- a/ANode/src/ExprAstVisitor.hpp
+++ b/ANode/src/ExprAstVisitor.hpp
@@ -44,6 +44,7 @@ class AstNodeState;
 class AstEventState;
 class AstNode;
 class AstVariable;
+class AstParentVariable;
 class AstFlag;
 
 namespace ecf {
@@ -75,6 +76,7 @@ public:
  	virtual void visitEventState(AstEventState*) = 0;
  	virtual void visitNode(AstNode*) = 0;
    virtual void visitVariable(AstVariable*) = 0;
+   virtual void visitParentVariable(AstParentVariable*) = 0;
    virtual void visitFlag(AstFlag*) = 0;
 };
 
@@ -108,6 +110,7 @@ public:
  	virtual void visitEventState(AstEventState*){}
  	virtual void visitNode(AstNode*);
    virtual void visitVariable(AstVariable*);
+   virtual void visitParentVariable(AstParentVariable*);
    virtual void visitFlag(AstFlag*);
 
 private:
@@ -143,6 +146,7 @@ public:
  	virtual void visitEventState(AstEventState*){}
  	virtual void visitNode(AstNode*);
    virtual void visitVariable(AstVariable*);
+   virtual void visitParentVariable(AstParentVariable*);
    virtual void visitFlag(AstFlag*);
 
 private:
diff --git a/ANode/src/ExprParser.cpp b/ANode/src/ExprParser.cpp
index 2349050..b8f2ce8 100644
--- a/ANode/src/ExprParser.cpp
+++ b/ANode/src/ExprParser.cpp
@@ -137,6 +137,7 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
    static const int flag_zombie_ID   = 59;
    static const int flag_ID          = 60;
    static const int root_path_ID     = 61;
+   static const int parent_variable_ID = 62;
 
     template <typename ScannerT>
     struct definition {
@@ -196,6 +197,7 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
         rule<ScannerT,parser_tag<calc_grouping_ID> >   calc_grouping;
         rule<ScannerT,parser_tag<calc_subexpression_ID> >   calc_subexpression;
         rule<ScannerT,parser_tag<basic_variable_path_ID> >   basic_variable_path;
+        rule<ScannerT,parser_tag<parent_variable_ID> >   parent_variable ;
         rule<ScannerT,parser_tag<compare_expression_ID> >   compare_expression;
 
         rule<ScannerT,parser_tag<flag_path_ID> >   flag_path;
@@ -313,6 +315,7 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
 
           variable = leaf_node_d [ nodename ];
           basic_variable_path = nodepath >> discard_node_d[ ch_p(':') ] >> variable ;
+          parent_variable = ch_p(':') >> variable ; // if we discard_node, then we get just 'variable' and NOT parent_variable
 
           root_path = leaf_node_d[ (str_p("/")) ] ;
           flag_path = ( nodepath | root_path) >> discard_node_d[ str_p("<flag>") ] >> flag ;
@@ -336,6 +339,7 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
                  | basic_variable_path
                  | discard_node_d[ ch_p('(') ] >>  calc_expression >> discard_node_d[ ch_p(')') ]
                  | flag_path
+                 | parent_variable
                  | root_node_d[operators] >>  calc_factor
                  | cal_date_to_julian
                  | cal_julian_to_date
@@ -399,6 +403,7 @@ struct ExpressionGrammer : public grammar<ExpressionGrammer>
           BOOST_SPIRIT_DEBUG_NODE(event_state);
           BOOST_SPIRIT_DEBUG_NODE(variable);
           BOOST_SPIRIT_DEBUG_NODE(basic_variable_path);
+          BOOST_SPIRIT_DEBUG_NODE(parent_variable);
           BOOST_SPIRIT_DEBUG_NODE(flag_path);
           BOOST_SPIRIT_DEBUG_NODE(calc_factor);
           BOOST_SPIRIT_DEBUG_NODE(calc_expression);
@@ -476,6 +481,7 @@ static void populate_rule_names()
       rule_names[ExpressionGrammer::calc_grouping_ID  ] = "calc_grouping_ID";
       rule_names[ExpressionGrammer::calc_subexpression_ID  ] = "calc_subexpression_ID";
       rule_names[ExpressionGrammer::basic_variable_path_ID  ] = "basic_variable_path_ID";
+      rule_names[ExpressionGrammer::parent_variable_ID  ] = "parent_variable_ID";
       rule_names[ExpressionGrammer::compare_expression_ID  ] = "compare_expression_ID";
    }
 }
@@ -731,6 +737,16 @@ Ast* createAst( const tree_iter_t& i, const std::map< parser_id, std::string >&
       boost::algorithm::trim(name);     // don't know why we get leading/trailing spaces
       return new AstVariable( nodePath, name );
    }
+   else if ( i->value.id() == ExpressionGrammer::parent_variable_ID) {
+
+       // tree_iter_t the_colon = i->children.begin(); ignore
+       tree_iter_t the_variable_t = i->children.begin()+1;
+
+       string the_variable(the_variable_t->value.begin(),the_variable_t->value.end() );
+       boost::algorithm::trim(the_variable ); // don't know why we get leading/trailing spaces
+       LOG_ASSERT( !the_variable.empty() , "");
+       return new AstParentVariable( the_variable  );
+    }
    else if ( i->value.id() == ExpressionGrammer::dot_dot_path_ID) {
 
       string thevalue( i->value.begin(), i->value.end() );
diff --git a/ANode/src/Expression.cpp b/ANode/src/Expression.cpp
index fffe863..775f3bf 100644
--- a/ANode/src/Expression.cpp
+++ b/ANode/src/Expression.cpp
@@ -106,6 +106,31 @@ Expression::Expression()
 Expression::Expression(const Expression& rhs)
 : vec_(rhs.vec_), makeFree_(rhs.makeFree_), state_change_no_(0),theCombinedAst_(0) {}
 
+
+std::auto_ptr<AstTop> Expression::parse(const std::string& expression_to_parse,const std::string& error_msg_context)
+{
+   PartExpression exp(expression_to_parse);
+   string parseErrorMsg;
+   std::auto_ptr<AstTop> ast = exp.parseExpressions( parseErrorMsg );
+   if (!ast.get()) {
+      std::stringstream ss; ss << error_msg_context  << " Failed to parse expression '" << expression_to_parse  << "'.  " << parseErrorMsg;
+      throw std::runtime_error( ss.str() ) ;
+   }
+   return ast;
+}
+
+std::auto_ptr<AstTop> Expression::parse_no_throw(const std::string& expression_to_parse,std::string& error_msg_context)
+{
+   PartExpression exp(expression_to_parse);
+   string parseErrorMsg;
+   std::auto_ptr<AstTop> ast = exp.parseExpressions( parseErrorMsg );
+   if (!ast.get()) {
+      std::stringstream ss; ss << error_msg_context  << " Failed to parse expression '" << expression_to_parse  << "'.  " << parseErrorMsg;
+      error_msg_context = ss.str();
+   }
+   return ast;
+}
+
 std::ostream& Expression::print(std::ostream& os, const std::string& exprType) const
 {
    BOOST_FOREACH(const PartExpression& expr, vec_ ) {
diff --git a/ANode/src/Expression.hpp b/ANode/src/Expression.hpp
index 8bc9a6b..1e9c691 100644
--- a/ANode/src/Expression.hpp
+++ b/ANode/src/Expression.hpp
@@ -94,6 +94,16 @@ public:
       return !operator==(rhs);
    }
 
+   /// Helper function, will parse the expression and return the abstract syntax tree
+
+   static std::auto_ptr<AstTop> parse(
+            const std::string& expression_to_parse,
+            const std::string& error_msg_context); // Will throw for parse errors
+   static std::auto_ptr<AstTop> parse_no_throw(
+            const std::string& expression_to_parse,
+            std::string& error_msg_context);
+
+
    /// 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;
diff --git a/ANode/src/InLimit.cpp b/ANode/src/InLimit.cpp
index 9665b5f..a736119 100644
--- a/ANode/src/InLimit.cpp
+++ b/ANode/src/InLimit.cpp
@@ -13,6 +13,8 @@
 // Description :
 //============================================================================
 
+#include <boost/lexical_cast.hpp>
+
 #include <assert.h>
 #include <sstream>
 #include <stdexcept>
@@ -74,10 +76,10 @@ std::ostream& InLimit::print( std::ostream& os ) const {
 }
 
 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();
+   std::string ret = "inlimit ";
+   if ( pathToNode_.empty() )  ret += name_;
+   else                      { ret += pathToNode_; ret += Str::COLON(); ret += name_; }
+   if ( tokens_ != 1 )       { ret += " "; ret += boost::lexical_cast<std::string>(tokens_); }
+   return ret;
 }
 
diff --git a/ANode/src/InLimitMgr.cpp b/ANode/src/InLimitMgr.cpp
index 10a9c6a..6508664 100644
--- a/ANode/src/InLimitMgr.cpp
+++ b/ANode/src/InLimitMgr.cpp
@@ -22,6 +22,7 @@
 #include "Memento.hpp"
 #include "Ecf.hpp"
 #include "Str.hpp"
+#include "Extract.hpp"
 
 using namespace ecf;
 using namespace std;
@@ -77,18 +78,35 @@ void InLimitMgr::addInLimit(const InLimit& l )
 
 bool InLimitMgr::deleteInlimit(const std::string& name)
 {
-	if (name.empty()) {
- 	  	inLimitVec_.clear();
-  		return true;
-	}
+   //cout << "InLimitMgr::deleteInlimit: " << name << "\n";
+   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);
+   string path_to_limit; // This can be empty
+   string limit_name;
+   (void)Extract::pathAndName( name, path_to_limit, limit_name  ); // already checked for empty name
+   //cout << "   path_to_limit:" << path_to_limit << "\n";
+   //cout << "   limit_name:" <<  limit_name << "\n";
+
+
+   for(size_t i = 0; i < inLimitVec_.size(); i++) {
+      //cout << "   " << i << ": " << inLimitVec_[i].pathToNode() << "  :  " << inLimitVec_[i].name() << "\n";
+      if (path_to_limit.empty()) {
+         if (inLimitVec_[i].name() == limit_name ) {
+            inLimitVec_.erase( inLimitVec_.begin() + i );
+            return true;
+         }
+      }
+      else {
+         if (inLimitVec_[i].name() == limit_name && inLimitVec_[i].pathToNode() == path_to_limit) {
+            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
diff --git a/ANode/src/Limit.cpp b/ANode/src/Limit.cpp
index d2683b2..7d5d85d 100644
--- a/ANode/src/Limit.cpp
+++ b/ANode/src/Limit.cpp
@@ -101,9 +101,11 @@ std::ostream& Limit::print( std::ostream& os ) const {
 }
 
 std::string Limit::toString() const {
-   std::stringstream ss;
-   ss << "limit " << name_ << " " << theLimit_;
-   return ss.str();
+   std::string ret = "limit ";
+   ret += name_;
+   ret += " ";
+   ret += boost::lexical_cast<std::string>(theLimit_);
+   return ret;
 }
 
 void Limit::decrement( int tokens ,  const std::string& abs_node_path) {
diff --git a/ANode/src/Node.cpp b/ANode/src/Node.cpp
index 380fd95..839695e 100644
--- a/ANode/src/Node.cpp
+++ b/ANode/src/Node.cpp
@@ -37,6 +37,7 @@
 #include "SuiteChanged.hpp"
 #include "CmdContext.hpp"
 #include "AbstractObserver.hpp"
+#include "DefsStructureParser.hpp"
 
 using namespace ecf;
 using namespace std;
@@ -127,6 +128,22 @@ void Node::delete_attributes() {
    delete misc_attrs_;
 }
 
+node_ptr Node::create(const std::string& node_string)
+{
+   DefsStructureParser parser( node_string  );
+   std::string errorMsg,warningMsg;
+   (void)parser.doParse(errorMsg,warningMsg);
+   return parser.the_node_ptr(); // can return NULL
+}
+
+node_ptr Node::create(const std::string& node_string, std::string& error_msg)
+{
+   DefsStructureParser parser( node_string  );
+   std::string warningMsg;
+   if (!parser.doParse(error_msg,warningMsg)) return node_ptr();
+   return parser.the_node_ptr();
+}
+
 Node& Node::operator=(const Node& rhs)
 {
    // Note:: Defs assignment operator use copy/swap, hence this assignemnt note used
@@ -1053,18 +1070,17 @@ bool Node::variable_substitution(std::string& cmd, const NameValueMap& user_edit
 
       // ****************************************************************************************
       // 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
+      //    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
+      // Leave ECF_JOB and ECF_JOBOUT out of this list: As user may legitamly override these. ECFLOW-999
       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_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_HOST())    != 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_NAME())    != std::string::npos) generated_variable = true;
          else if ( percentVar.find(Str::ECF_TRYNO())   != std::string::npos) generated_variable = true;
       }
@@ -1298,22 +1314,44 @@ bool Node::check_expressions(Ast* ast,const std::string& expr,bool trigger, std:
       // Also resolve references to events,meter,repeats variables.
       AstResolveVisitor astVisitor(this);
       ast->accept(astVisitor);
-
       if ( !astVisitor.errorMsg().empty() ) {
          errorMsg += "Error: Expression node tree references failed for '";
          if ( trigger ) errorMsg += "trigger ";
          else           errorMsg += "complete ";
          errorMsg += expr;
          errorMsg += "' at ";
-         errorMsg += absNodePath();
+         errorMsg += debugNodePath();
          errorMsg += "\n ";
          errorMsg += astVisitor.errorMsg();
          return false;
       }
+
+      // check divide by zero and module by zero
+      if (!ast->check(errorMsg)) {
+         errorMsg += " Error: Expression checking failed for '";
+         if ( trigger ) errorMsg += "trigger ";
+         else           errorMsg += "complete ";
+         errorMsg += expr;
+         errorMsg += "' at ";
+         errorMsg += debugNodePath();
+         return false;
+      }
    }
    return true;
 }
 
+std::auto_ptr<AstTop> Node::parse_and_check_expressions(const std::string& expr, bool trigger, const std::string& context)
+{
+   std::auto_ptr<AstTop> ast = Expression::parse(expr,context ); // will throw for errors
+
+   std::string errorMsg;
+   if (!check_expressions(ast.get(),expr,trigger,errorMsg)) {
+      std::stringstream ss; ss << context << " "  << errorMsg ;
+      throw std::runtime_error( ss.str() );
+   }
+   return ast;
+}
+
 bool Node::check(std::string& errorMsg, std::string& warningMsg) const
 {
    //#ifdef DEBUG
@@ -1330,33 +1368,17 @@ bool Node::check(std::string& errorMsg, std::string& warningMsg) const
    /// Even if the code parses, check the expression for divide by zero, for divide and modulo operators
    AstTop* ctop = completeAst(errorMsg);
    if (ctop) {
-
-      // capture node path resolve errors
+      // capture node path resolve errors, and expression divide/module by zero
       std::string expr;
       if (completeExpr_) expr = completeExpr_->expression();
       (void)check_expressions(ctop,expr,false,errorMsg);
-
-      if (!ctop->check(errorMsg)) {
-         errorMsg += " ";
-         errorMsg += expr;
-         errorMsg += " on ";
-         errorMsg += debugNodePath();
-      }
    }
+
    AstTop* ttop = triggerAst(errorMsg);
    if (ttop) {
-
-      // capture node path resolve errors
       std::string expr;
       if (triggerExpr_) expr = triggerExpr_->expression();
       (void)check_expressions(ttop,expr,true,errorMsg);
-
-      if (!ttop->check(errorMsg)) {
-         errorMsg += " ";
-         errorMsg += expr;
-         errorMsg += " on ";
-         errorMsg += debugNodePath();
-      }
    }
 
    // check inLimit references to limits.
@@ -1477,6 +1499,12 @@ std::ostream& Node::print(std::ostream& os) const
    return os;
 }
 
+std::string Node::print(PrintStyle::Type_t p_style) const
+{
+   PrintStyle print_style(p_style);
+   return to_string();
+}
+
 std::string Node::to_string() const
 {
    std::stringstream ss;
@@ -2019,15 +2047,12 @@ size_t Node::position() const
 
 void Node::gen_variables(std::vector<Variable>& vec) const
 {
-   if (!repeat_.empty()) {
-      vec.push_back(repeat_.gen_variable());
-   }
+    repeat_.gen_variables(vec);  // if repeat_ is empty vec is unchanged
 }
 
 const Variable& Node::findGenVariable(const std::string& name) const
 {
-   if (!repeat_.empty() && repeat_.name() == name) return repeat_.gen_variable();
-   return Variable::EMPTY();
+    return repeat_.find_gen_variable(name); // if repeat_ is empty find returns empty variable by ref
 }
 
 void Node::update_repeat_genvar() const
diff --git a/ANode/src/Node.hpp b/ANode/src/Node.hpp
index 51c1141..3d53451 100644
--- a/ANode/src/Node.hpp
+++ b/ANode/src/Node.hpp
@@ -58,6 +58,7 @@
 #include "Flag.hpp"
 #include "Aspect.hpp"
 #include "Attr.hpp"
+#include "PrintStyle.hpp"
 
 class AbstractObserver;
 namespace ecf { class Simulator; class SimulatorVisitor; class DefsAnalyserVisitor; class FlatAnalyserVisitor; } // forward declare for friendship
@@ -72,6 +73,10 @@ public:
    Node(const Node& rhs);
    virtual ~Node();
 
+   // parse string and create suite || family || task || alias. Can return a NULL node_ptr() for errors
+   static node_ptr create(const std::string& node_string);
+   static node_ptr create(const std::string& node_string, std::string& error_msg);
+
    /// The Parent Must set the parent pointer. For a Suite however this will be NULL
    void set_parent(Node* p) { parent_ = p; }
 
@@ -222,6 +227,7 @@ public:
 
    // standard functions: ==============================================
    virtual std::ostream& print(std::ostream&) const;
+   std::string print(PrintStyle::Type_t type) const;
    bool operator==(const Node& rhs) const;
    virtual bool checkInvariants(std::string& errorMsg) const;
 
@@ -568,9 +574,12 @@ public:
    /// update change numbers to force sync
    virtual void force_sync(){};
 
-   /// check trigger expression have nodes that resolve
+   /// check trigger expression have nodes and events,meter,repeat that resolve
    bool check_expressions(Ast*,const std::string& expr, bool trigger, std::string& errorMsg) const;
 
+   /// check trigger expression have nodes and events,meter,repeat that resolve, will throw for error
+   std::auto_ptr<AstTop> parse_and_check_expressions(const std::string& expr, bool trigger, const std::string& context);
+
 protected:
    /// Used in conjunction with Node::position()
    /// returns std::numeric_limits<std::size_t>::max() if child not found
@@ -647,6 +656,7 @@ private:
    int findExprVariableValueAndType( const std::string& name, std::string& varType) const;
    void findExprVariableAndPrint( const std::string& name, std::ostream& os) const;
    friend class VariableHelper;
+   friend class AstParentVariable;
 
 private:
    bool checkForAutoCancel(const ecf::Calendar& c) const;
diff --git a/ANode/src/NodeChange.cpp b/ANode/src/NodeChange.cpp
index 75a73a5..6e5f456 100644
--- a/ANode/src/NodeChange.cpp
+++ b/ANode/src/NodeChange.cpp
@@ -99,44 +99,14 @@ void Node::changeLabel(const std::string& name,const std::string& value)
 
 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() );
-	}
-
-	std::string errorMsg;
-   if (!check_expressions(ast.get(),expression,true/*trigger*/,errorMsg)) {
-      std::stringstream ss;
-      ss << "Node::changeTrigger: Failed checking. " << errorMsg ;
-      throw std::runtime_error( ss.str() );
-   }
-
+   (void)parse_and_check_expressions(expression,true/*trigger*/,"Node::changeTrigger:" ); // will throw for errors
 	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() );
-	}
-
-   std::string errorMsg;
-   if (!check_expressions(ast.get(),expression,false/*complete*/,errorMsg)) {
-      std::stringstream ss;
-      ss << "Node::changeComplete: Failed checking. " << errorMsg ;
-      throw std::runtime_error( ss.str() );
-   }
-
+   (void)parse_and_check_expressions(expression,false/*complete*/,"Node::changeComplete:" ); // will throw for errors
 	deleteComplete();
 	add_complete( expression );
 }
diff --git a/ANode/src/NodeDelete.cpp b/ANode/src/NodeDelete.cpp
index e475013..dc9b70c 100644
--- a/ANode/src/NodeDelete.cpp
+++ b/ANode/src/NodeDelete.cpp
@@ -134,7 +134,7 @@ void Node::deleteVariable( const std::string& name)
 			return;
 		}
 	}
-	throw std::runtime_error("Node::deleteVariable: Can not find variable of name " + name);
+	throw std::runtime_error("Node::deleteVariable: Can not find 'user' variable of name " + name);
 }
 
 void Node::deleteEvent(const std::string& name)
diff --git a/ANode/src/ResolveExternsVisitor.hpp b/ANode/src/ResolveExternsVisitor.hpp
index b8c74c3..8f44a08 100644
--- a/ANode/src/ResolveExternsVisitor.hpp
+++ b/ANode/src/ResolveExternsVisitor.hpp
@@ -70,6 +70,7 @@ public:
  	virtual void visitEventState(AstEventState*){}
  	virtual void visitNode(AstNode*);
    virtual void visitVariable(AstVariable*);
+   virtual void visitParentVariable(AstParentVariable*) {}
    virtual void visitFlag(AstFlag*);
 
 private:
diff --git a/ANode/src/ServerState.cpp b/ANode/src/ServerState.cpp
index 6e3026e..84702a6 100644
--- a/ANode/src/ServerState.cpp
+++ b/ANode/src/ServerState.cpp
@@ -37,7 +37,17 @@ ServerState::ServerState() :
  	jobSubmissionInterval_( 60 ),
  	jobGeneration_( true )
 {
-	setup_default_env();
+	setup_default_env(Str::DEFAULT_PORT_NUMBER());
+}
+
+ServerState::ServerState(const std::string& port)  :
+    state_change_no_(0),
+    variable_state_change_no_(0),
+    server_state_( default_state() ),
+    jobSubmissionInterval_( 60 ),
+    jobGeneration_( true )
+{
+   setup_default_env(port);
 }
 
 ServerState::ServerState(const ServerState& rhs)
@@ -79,10 +89,25 @@ bool ServerState::operator==(const ServerState& rhs) const
       return false;
    }
 
-   /// Check pointing, SAVES server variables, since they are visualised by client like ecflow_ui
-   /// 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.
+   /// Check pointing and PrintStyle::MIGRATE, SAVES server variables, since they are visualised by client like ecflow_ui
+   /// However the server does NOT load the server variable in the DEFS. Otherwise uses can change ECF_PID.
+
+   if ( !DebugEquality::ignore_server_variables() && 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;
 }
@@ -115,7 +140,8 @@ bool ServerState::compare(const ServerState& rhs) const
       return false;
    }
 
-   if ( server_variables_ != rhs.server_variables_) {
+
+   if ( !DebugEquality::ignore_server_variables() && server_variables_ != rhs.server_variables_) {
 #ifdef DEBUG
       if (Ecf::debug_equality()) {
          std::cout << "ServerState::compare server_variables_ != rhs.server_variables_\n";
@@ -155,10 +181,10 @@ void ServerState::add_or_update_server_variables( const NameValueVec& env)
    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);
+      add_or_update_server_variable((*i).first, (*i).second);
    }
 }
-void ServerState::add_or_update_server_variables( const std::string& name, const std::string& value)
+void ServerState::add_or_update_server_variable( 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) {
@@ -444,13 +470,13 @@ void ServerState::set_state(SState::State s) {
 }
 
 
-void ServerState::setup_default_env()
+void ServerState::setup_default_env(const std::string& port)
 {
 	// 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());
+	hostPort_ = std::make_pair(Str::LOCALHOST(),port);
 
-	setup_default_server_variables(server_variables_,Str::DEFAULT_PORT_NUMBER());
+	setup_default_server_variables(server_variables_,port);
 }
 
 void ServerState::setup_default_server_variables(std::vector<Variable>&  server_variables, const std::string& port)
diff --git a/ANode/src/ServerState.hpp b/ANode/src/ServerState.hpp
index 16e923f..5f084bf 100644
--- a/ANode/src/ServerState.hpp
+++ b/ANode/src/ServerState.hpp
@@ -35,6 +35,7 @@
 class ServerState {
 public:
    ServerState();
+   ServerState(const std::string& port); // used in test to init server variables
    ServerState(const ServerState&);
 
    /// Check pointing, SAVES server variables, since they are visualised by client like ecflow_ui
@@ -58,6 +59,7 @@ public:
    /// However user variables can be freely added,deleted and modified
    /// They will override server variables of the same name
 
+   void add_or_update_server_variable( const std::string&, const std::string&);
    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);
@@ -107,9 +109,7 @@ public:
    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&);
+ 	void setup_default_env(const std::string& port);
 
 private:
 
diff --git a/ANode/src/Submittable.cpp b/ANode/src/Submittable.cpp
index 37cada8..0a9b968 100644
--- a/ANode/src/Submittable.cpp
+++ b/ANode/src/Submittable.cpp
@@ -167,9 +167,9 @@ 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_;
+   std::string ret;
+   if ( !jobsPassword_.empty() && jobsPassword_!= Submittable::DUMMY_JOBS_PASSWORD()) { ret += " passwd:"; ret += jobsPassword_;}
+   if ( !process_or_remote_id_.empty() )  { ret += " rid:"; ret += 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.
@@ -177,11 +177,11 @@ std::string Submittable::write_state() const
       std::string the_abort_reason = abortedReason_;
       Str::replaceall(the_abort_reason,"\n","\\n");
       Str::replaceall(the_abort_reason,";"," ");
-      ss << " abort<:" << the_abort_reason << ">abort";
+      ret += " abort<:"; ret += the_abort_reason; ret += ">abort";
    }
-   if ( tryNo_ != 0)  ss << " try:" << tryNo_;
-   ss << Node::write_state();
-   return ss.str();
+   if ( tryNo_ != 0) { ret += " try:"; ret += boost::lexical_cast<std::string>(tryNo_); }
+   ret += Node::write_state();
+   return ret;
 }
 
 void Submittable::read_state(const std::string& line,const std::vector<std::string>& lineTokens)
diff --git a/ANode/src/Submittable.hpp b/ANode/src/Submittable.hpp
index 0d0c6ac..88713f7 100644
--- a/ANode/src/Submittable.hpp
+++ b/ANode/src/Submittable.hpp
@@ -23,14 +23,12 @@ 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),
+   : tryNo_(0),
      state_change_no_(0),
      sub_gen_variables_(NULL) {}
 
diff --git a/ANode/src/Suite.cpp b/ANode/src/Suite.cpp
index cb1fce1..7fbbf33 100644
--- a/ANode/src/Suite.cpp
+++ b/ANode/src/Suite.cpp
@@ -262,8 +262,8 @@ bool Suite::operator==(const Suite& rhs) const
  	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";
-		}
+         std::cout << "Suite::operator==(clockAttr_.get() && !rhs.clockAttr_.get()) || (!clockAttr_.get() && rhs.clockAttr_.get() " << debugNodePath() << "\n";
+ 		}
 #endif
 		return false;
 	}
@@ -271,6 +271,7 @@ bool Suite::operator==(const Suite& rhs) const
 #ifdef DEBUG
 		if (Ecf::debug_equality()) {
 			std::cout << "Suite::operator== (clockAttr_ && rhs.clockAttr_ && !(*clockAttr_ == *rhs.clockAttr_)) " << debugNodePath() << "\n";
+			std::cout << "clockAttr_: " << clockAttr_->toString() << "  rhs.clockAttr_: " << rhs.clockAttr_->toString() << "\n";
 		}
 #endif
 		return false;
@@ -708,6 +709,7 @@ SuiteGenVariables::SuiteGenVariables(const Suite* s)
    genvar_month_("MONTH", "", false ),
    genvar_ecf_date_("ECF_DATE", "", false ),
    genvar_ecf_clock_("ECF_CLOCK", "", false ),
+   genvar_ecf_julian_("ECF_JULIAN", "", false ),
    force_update_(false){}
 
 void SuiteGenVariables::update_generated_variables() const
@@ -813,6 +815,9 @@ void SuiteGenVariables::update_generated_variables() const
       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_ecf_clock_.set_value( smsclock );
       //cout << "genvar_ecf_clock_ = " << genvar_ecf_clock_.theValue() << "\n";
+
+
+      genvar_ecf_julian_.set_value( boost::lexical_cast<std::string>( suite_->calendar_.suiteTime().date().julian_day()) );
    }
 }
 
@@ -830,6 +835,7 @@ const Variable& SuiteGenVariables::findGenVariable(const std::string& name) cons
    if (genvar_month_.name() == name) return genvar_month_;
    if (genvar_ecf_clock_.name() == name) return genvar_ecf_clock_;
    if (genvar_ecf_time_.name() == name) return genvar_ecf_time_;
+   if (genvar_ecf_julian_.name() == name) return genvar_ecf_julian_;
    if (genvar_time_.name() == name) return genvar_time_;
    return Variable::EMPTY();
 }
@@ -848,5 +854,6 @@ void SuiteGenVariables::gen_variables(std::vector<Variable>& vec) const
    vec.push_back(genvar_month_);
    vec.push_back(genvar_ecf_clock_);
    vec.push_back(genvar_ecf_time_);
+   vec.push_back(genvar_ecf_julian_);
    vec.push_back(genvar_time_);
 }
diff --git a/ANode/src/Suite.hpp b/ANode/src/Suite.hpp
index 95e22a8..e815884 100644
--- a/ANode/src/Suite.hpp
+++ b/ANode/src/Suite.hpp
@@ -179,6 +179,7 @@ private:
    mutable Variable genvar_month_;    // *NOT* persisted, can be generated by calling update_generated_variables()
    mutable Variable genvar_ecf_date_; // *NOT* persisted, can be generated by calling update_generated_variables()
    mutable Variable genvar_ecf_clock_;// *NOT* persisted, can be generated by calling update_generated_variables()
+   mutable Variable genvar_ecf_julian_;// *NOT* persisted, can be generated by calling update_generated_variables()
    mutable bool force_update_;
 };
 
diff --git a/ANode/src/Task.cpp b/ANode/src/Task.cpp
index 3d0e82b..526272a 100644
--- a/ANode/src/Task.cpp
+++ b/ANode/src/Task.cpp
@@ -130,10 +130,10 @@ 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();
+   std::string ret;
+   if (alias_no_ != 0) { ret += " alias_no:"; ret += boost::lexical_cast<std::string>(alias_no_);}
+   ret += Submittable::write_state();
+   return ret;
 }
 
 void Task::read_state(const std::string& line, const std::vector<std::string>& lineTokens) {
@@ -453,7 +453,7 @@ bool Task::resolveDependencies(JobsParam& jobsParam)
 	else if (task_state == NState::ABORTED) {
 
 	   /// If we have been forcibly aborted by the user. Do not resubmit jobs, until *begin* or *re-queue*. ECFLOW-344
-	   if (flag().is_set(ecf::Flag::FORCE_ABORT)) {
+	   if (get_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
@@ -461,7 +461,7 @@ bool Task::resolveDependencies(JobsParam& jobsParam)
 	   }
 
       /// If we have been killed by the user. Do not resubmit jobs, until *begin* or *re-queue*
-      if (flag().is_set(ecf::Flag::KILLED)) {
+      if (get_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
@@ -497,7 +497,7 @@ bool Task::resolveDependencies(JobsParam& jobsParam)
 
    /// If we have been forcibly aborted by the user. Do not resubmit jobs, until *begin* or *re-queue*
 	/// This can be set via ALTER, so independent of state.
-   if (flag().is_set(ecf::Flag::FORCE_ABORT)) {
+   if (get_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
diff --git a/ANode/test/MyDefsFixture.hpp b/ANode/test/MyDefsFixture.hpp
index a9f5d72..71b942a 100644
--- a/ANode/test/MyDefsFixture.hpp
+++ b/ANode/test/MyDefsFixture.hpp
@@ -18,6 +18,7 @@
 //============================================================================
 #include <boost/lexical_cast.hpp>
 
+#include "Str.hpp"
 #include "Defs.hpp"
 #include "Suite.hpp"
 #include "Family.hpp"
@@ -32,7 +33,7 @@
 // =======================================================================
 struct MyDefsFixture {
 
-	MyDefsFixture(const std::string& fileName = "defsfile.txt") : defsfile_()
+	MyDefsFixture(const std::string& port = ecf::Str::DEFAULT_PORT_NUMBER()) : defsfile_(port)
 	{
 		suite_ptr  suite = create_suite();
 
@@ -57,24 +58,16 @@ struct 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 create_defs(const std::string& port = ecf::Str::DEFAULT_PORT_NUMBER()) const {
 
-		defs_ptr defs = Defs::create();
+		defs_ptr defs = Defs::create(port);
 
  		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");
+      defs->set_server().add_or_update_server_variable("MyDefsFixture_server_variable","This is a server variable");
 
 		// add an empty suite. Needed for CHECK_JOB_GEN_ONLY cmd
 		defs->addSuite( Suite::create("EmptySuite" ) );
@@ -115,14 +108,7 @@ private:
 		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);
+	   std::vector<ecf::Child::CmdType> child_cmds = ecf::Child::list();
 		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) );
diff --git a/ANode/test/TestAssignmentOperator.cpp b/ANode/test/TestAssignmentOperator.cpp
index 74f8c1b..8305a34 100644
--- a/ANode/test/TestAssignmentOperator.cpp
+++ b/ANode/test/TestAssignmentOperator.cpp
@@ -27,22 +27,22 @@ BOOST_AUTO_TEST_CASE( test_defs_assignment_operator )
    cout << "ANode:: ...test_defs_assignment_operator\n";
    MyDefsFixture theDefsFixture;
 
-   Ecf::set_debug_equality(true);
    Defs defs;
    defs = theDefsFixture.defsfile_;
+   Ecf::set_debug_equality(true); // only has affect in DEBUG build
    BOOST_CHECK_MESSAGE( defs == theDefsFixture.defsfile_,"assignment failed");
+   Ecf::set_debug_equality(false); // only has affect in DEBUG build
 
    Defs empty;
    defs = empty;
+   Ecf::set_debug_equality(true); // only has affect in DEBUG build
    BOOST_CHECK_MESSAGE( defs == empty,"assignment failed");
-   Ecf::set_debug_equality(false);
+   Ecf::set_debug_equality(false); // only has affect in DEBUG build
 
    BOOST_CHECK_MESSAGE( !(defs == theDefsFixture.defsfile_),"assignment failure EXPECTED");
 
    theDefsFixture.defsfile_ =  empty;
-   Ecf::set_debug_equality(true);
    BOOST_CHECK_MESSAGE( theDefsFixture.defsfile_ == empty,"assignment failed");
-   Ecf::set_debug_equality(false);
 }
 
 BOOST_AUTO_TEST_CASE( test_suite_assignment_operator )
@@ -60,14 +60,7 @@ BOOST_AUTO_TEST_CASE( test_suite_assignment_operator )
    s1.addVariable( Variable("VAR","value") );
    s1.add_task( "t1" );
    s1.add_family( "f1" );
-   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);
+   std::vector<ecf::Child::CmdType> child_cmds = ecf::Child::list();
    s1.addZombie( ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10) );
    s1.addZombie( ZombieAttr(ecf::Child::ECF, child_cmds, ecf::User::FAIL,100) );
    s1.addZombie( ZombieAttr(ecf::Child::PATH, child_cmds, ecf::User::BLOCK,100) );
@@ -93,7 +86,7 @@ BOOST_AUTO_TEST_CASE( test_suite_assignment_operator )
    std::string suiteLimit = "suiteLimit";
    s1.addLimit( Limit(suiteLimit,10) );
 
-   Ecf::set_debug_equality(true);
+   DebugEquality debug_equality; // only as affect in DEBUG build
    Suite s2(s1); // s2 is copy
    BOOST_CHECK_MESSAGE( s1 == s2,"copy constructor failed");
 
@@ -106,8 +99,6 @@ BOOST_AUTO_TEST_CASE( test_suite_assignment_operator )
 
    s1 = s2;
    BOOST_CHECK_MESSAGE( s1 == s2,"assignment failed");
-
-   Ecf::set_debug_equality(false);
 }
 
 BOOST_AUTO_TEST_CASE( test_task_assignment_operator )
@@ -118,14 +109,7 @@ BOOST_AUTO_TEST_CASE( test_task_assignment_operator )
    Task s1("s1");
    s1.addAutoCancel( ecf::AutoCancelAttr(2) );
    s1.addVariable( Variable("VAR","value") );
-   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);
+   std::vector<ecf::Child::CmdType> child_cmds = ecf::Child::list();
    s1.addZombie( ZombieAttr(ecf::Child::USER, child_cmds, ecf::User::FOB,10) );
    s1.addZombie( ZombieAttr(ecf::Child::ECF, child_cmds, ecf::User::FAIL,100) );
    s1.addZombie( ZombieAttr(ecf::Child::PATH, child_cmds, ecf::User::BLOCK,100) );
@@ -166,7 +150,7 @@ BOOST_AUTO_TEST_CASE( test_task_assignment_operator )
    s1.addVerify( VerifyAttr(NState::COMPLETE,3) );
    s1.addLate( lateAttr );
 
-   Ecf::set_debug_equality(true);
+   DebugEquality debug_equality; // only as affect in DEBUG build
    Task s2(s1); // s2 is copy
    BOOST_CHECK_MESSAGE( s1 == s2,"copy constructor failed");
 
@@ -179,8 +163,6 @@ BOOST_AUTO_TEST_CASE( test_task_assignment_operator )
 
    s1 = s2;
    BOOST_CHECK_MESSAGE( s1 == s2,"assignment failed");
-
-   Ecf::set_debug_equality(false);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/ANode/test/TestCopyConstructor.cpp b/ANode/test/TestCopyConstructor.cpp
index b521a6a..4d5d4ed 100644
--- a/ANode/test/TestCopyConstructor.cpp
+++ b/ANode/test/TestCopyConstructor.cpp
@@ -27,10 +27,9 @@ BOOST_AUTO_TEST_CASE( test_copy_constructors )
    cout << "ANode:: ...test_copy_constructors\n";
    MyDefsFixture theDefsFixture;
 
-   Ecf::set_debug_equality(true);
+   DebugEquality debug_equality; // only as affect in DEBUG build
    Defs copy = Defs(theDefsFixture.defsfile_);
    BOOST_CHECK_MESSAGE( copy == theDefsFixture.defsfile_,"copy constructor failed");
-   Ecf::set_debug_equality(false);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/ANode/test/TestExprParser.cpp b/ANode/test/TestExprParser.cpp
index 55f082d..aa88fa1 100644
--- a/ANode/test/TestExprParser.cpp
+++ b/ANode/test/TestExprParser.cpp
@@ -82,6 +82,14 @@ BOOST_AUTO_TEST_CASE( test_expression_parser_basic )
    vec.push_back("comp == complete and ! ready == complete");   // we now store the not from the parse, for test comparison
    vec.push_back("comp == complete and ~ ready == complete");
 
+   vec.push_back(":VAR == 1");
+   vec.push_back(":VAR == /mc/main/ref:MC_STOP");
+   vec.push_back(":YMD - :YMD < 5");
+   vec.push_back(":YMD + :YMD < 5");
+   vec.push_back(":YMD / :YMD < 5");
+   vec.push_back(":YMD * :YMD < 5");
+   vec.push_back(":YMD % :YMD < 5");
+
    for(size_t i = 0; i < vec.size(); i++) {
 
       PartExpression part(vec[i]);
@@ -124,6 +132,7 @@ BOOST_AUTO_TEST_CASE( test_expression_parser_basic_with_brackets )
    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)");
+   vec.push_back("((:YMD + :YMD) < 5)");
 
    for(size_t i = 0; i < vec.size(); i++) {
 
@@ -352,6 +361,14 @@ BOOST_AUTO_TEST_CASE( test_parser_good_expressions )
    exprMap["(/s/f/t<flag>late or 1)"] = std::make_pair(AstOr::stype(),true);
    exprMap["/<flag>late"] = std::make_pair(AstFlag::stype(),false);
 
+   exprMap[":VAR == 0"] = std::make_pair(AstEqual::stype(),true);
+   exprMap[":VAR == 1"] = std::make_pair(AstEqual::stype(),false);
+   exprMap[":VAR == /mc/main/ref:MC_STOP"] = std::make_pair(AstEqual::stype(),true);
+   exprMap[":YMD - :YMD <= 5"] = std::make_pair(AstLessEqual::stype(),true);
+   exprMap[":YMD + :YMD <= 5"] = std::make_pair(AstLessEqual::stype(),true);
+   exprMap[":YMD * :YMD <= 5"] = std::make_pair(AstLessEqual::stype(),true);
+   exprMap[":YMD + 1 == 1"] = std::make_pair(AstEqual::stype(),true);
+
    int parse_failure = 0;
    int ast_failure = 0;
    std::pair<string, std::pair<string,bool> > p;
@@ -560,7 +577,8 @@ BOOST_AUTO_TEST_CASE( test_trigger_expression_divide_by_zero )
    // 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);
-
+   exprMap[":YMD % 0 == 0"] = std::make_pair(AstEqual::stype(),true);
+   exprMap[":YMD / 0 == 0"] = std::make_pair(AstEqual::stype(),true);
 
    std::pair<string, std::pair<string,bool> > p;
    BOOST_FOREACH(p, exprMap ) {
@@ -586,7 +604,6 @@ BOOST_AUTO_TEST_CASE( test_trigger_expression_divide_by_zero )
    }
 }
 
-
 BOOST_AUTO_TEST_CASE( test_parser_bad_expressions ) 
 {
    std::cout << "ANode:: ...test_parser_bad_expressions\n";
diff --git a/ANode/test/TestFindAbsNodePath.cpp b/ANode/test/TestFindAbsNodePath.cpp
index 203b3eb..9ba1479 100644
--- a/ANode/test/TestFindAbsNodePath.cpp
+++ b/ANode/test/TestFindAbsNodePath.cpp
@@ -62,8 +62,7 @@ BOOST_AUTO_TEST_CASE( test_find_abs_node_path )
    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;
+//   PrintStyle style(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());
diff --git a/ANode/test/TestFlagMigrated.cpp b/ANode/test/TestFlagMigrated.cpp
index 46cd0c3..ba77de0 100644
--- a/ANode/test/TestFlagMigrated.cpp
+++ b/ANode/test/TestFlagMigrated.cpp
@@ -48,12 +48,11 @@ BOOST_AUTO_TEST_CASE( test_flag_migrated )
 
    std::string file_name = File::test_data("ANode/test/data/test_flag_migrated","ANode");
    {
-      defs.save_as_checkpt(file_name);
-      Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+      defs.boost_save_as_checkpt(file_name);
+      Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
 
-      Ecf::set_debug_equality(true);
+      DebugEquality debug_equality; // only as affect in DEBUG build
       BOOST_CHECK_MESSAGE(defs == restored_defs, "Saved and restored defs not the same");
-      Ecf::set_debug_equality(false);
 
       std::vector<node_ptr> all_nodes;
       restored_defs.get_all_nodes(all_nodes);
@@ -67,24 +66,16 @@ BOOST_AUTO_TEST_CASE( test_flag_migrated )
       s->flag().set(ecf::Flag::MIGRATED);
 
       {
-         defs.save_as_checkpt(file_name);
-         Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+         defs.boost_save_as_checkpt(file_name);
+         Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
          std::vector<node_ptr> all_nodes;
          restored_defs.get_all_nodes(all_nodes);
          BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
          fs::remove(file_name);
       }
       {
-         std::string the_string;
-         defs.save_checkpt_as_string(the_string);
-         Defs restored_defs; restored_defs.restore_from_string(the_string);
-         std::vector<node_ptr> all_nodes;
-         restored_defs.get_all_nodes(all_nodes);
-         BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
-      }
-      {
-         defs.save_as_filename(file_name);
-         Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+         defs.boost_save_as_filename(file_name);
+         Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
          std::vector<node_ptr> all_nodes;
          restored_defs.get_all_nodes(all_nodes);
          BOOST_CHECK_MESSAGE(all_nodes.size()==1,"expected 1 nodes but found " << all_nodes.size());
@@ -99,24 +90,16 @@ BOOST_AUTO_TEST_CASE( test_flag_migrated )
       f1->flag().set(ecf::Flag::MIGRATED);
 
       {
-         defs.save_as_checkpt(file_name);
-         Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+         defs.boost_save_as_checkpt(file_name);
+         Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
          std::vector<node_ptr> all_nodes;
          restored_defs.get_all_nodes(all_nodes);
          BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
          fs::remove(file_name);
       }
       {
-         std::string the_string;
-         defs.save_checkpt_as_string(the_string);
-         Defs restored_defs; restored_defs.restore_from_string(the_string);
-         std::vector<node_ptr> all_nodes;
-         restored_defs.get_all_nodes(all_nodes);
-         BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
-      }
-      {
-         defs.save_as_filename(file_name);
-         Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+         defs.boost_save_as_filename(file_name);
+         Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
          std::vector<node_ptr> all_nodes;
          restored_defs.get_all_nodes(all_nodes);
          BOOST_CHECK_MESSAGE(all_nodes.size()==2,"expected 2 nodes but found " << all_nodes.size());
@@ -131,24 +114,16 @@ BOOST_AUTO_TEST_CASE( test_flag_migrated )
       t2->flag().set(ecf::Flag::MIGRATED);
 
       {
-         defs.save_as_checkpt(file_name);
-         Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+         defs.boost_save_as_checkpt(file_name);
+         Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
          std::vector<node_ptr> all_nodes;
          restored_defs.get_all_nodes(all_nodes);
          BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
          fs::remove(file_name);
       }
       {
-         std::string the_string;
-         defs.save_checkpt_as_string(the_string);
-         Defs restored_defs; restored_defs.restore_from_string(the_string);
-         std::vector<node_ptr> all_nodes;
-         restored_defs.get_all_nodes(all_nodes);
-         BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
-      }
-      {
-         defs.save_as_filename(file_name);
-         Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+         defs.boost_save_as_filename(file_name);
+         Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
          std::vector<node_ptr> all_nodes;
          restored_defs.get_all_nodes(all_nodes);
          BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
@@ -183,24 +158,15 @@ BOOST_AUTO_TEST_CASE( test_flag_migrated_with_reque )
       s->flag().set(ecf::Flag::MIGRATED);
 
       {
-         defs.save_as_checkpt(file_name);
-         Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+         defs.boost_save_as_checkpt(file_name);
+         Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
          std::vector<node_ptr> all_nodes; restored_defs.get_all_nodes(all_nodes);
          BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
          fs::remove(file_name);
       }
       {
-         std::string the_string;
-         defs.save_checkpt_as_string(the_string);
-         Defs restored_defs; restored_defs.restore_from_string(the_string);
-         std::vector<node_ptr> all_nodes;
-         restored_defs.get_all_nodes(all_nodes);
-         BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
-      }
-
-      {
-         defs.save_as_filename(file_name);
-         Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+         defs.boost_save_as_filename(file_name);
+         Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
          std::vector<node_ptr> all_nodes; restored_defs.get_all_nodes(all_nodes);
          BOOST_CHECK_MESSAGE(all_nodes.size()==1,"expected 1 nodes but found " << all_nodes.size());
          fs::remove(file_name);
@@ -214,24 +180,15 @@ BOOST_AUTO_TEST_CASE( test_flag_migrated_with_reque )
       BOOST_CHECK_MESSAGE(!s->get_flag().is_set(ecf::Flag::MIGRATED),"Expected migrate flag to be cleared");
 
       {
-         defs.save_as_checkpt(file_name);
-         Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+         defs.boost_save_as_checkpt(file_name);
+         Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
          std::vector<node_ptr> all_nodes; restored_defs.get_all_nodes(all_nodes);
          BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
          fs::remove(file_name);
       }
       {
-         std::string the_string;
-         defs.save_checkpt_as_string(the_string);
-         Defs restored_defs; restored_defs.restore_from_string(the_string);
-         std::vector<node_ptr> all_nodes;
-         restored_defs.get_all_nodes(all_nodes);
-         BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
-      }
-
-      {
-          defs.save_as_filename(file_name);
-          Defs restored_defs; restored_defs.restore_from_checkpt(file_name);
+          defs.boost_save_as_filename(file_name);
+          Defs restored_defs; restored_defs.boost_restore_from_checkpt(file_name);
           std::vector<node_ptr> all_nodes; restored_defs.get_all_nodes(all_nodes);
           BOOST_CHECK_MESSAGE(all_nodes.size()==expected_all_nodes,"expected " << expected_all_nodes << " nodes but found " << all_nodes.size());
           fs::remove(file_name);
diff --git a/ANode/test/TestMigration.cpp b/ANode/test/TestMigration.cpp
index 1c1e52e..28e6f08 100644
--- a/ANode/test/TestMigration.cpp
+++ b/ANode/test/TestMigration.cpp
@@ -12,7 +12,6 @@
 // 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"
 
@@ -32,81 +31,61 @@ 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 )
+BOOST_AUTO_TEST_CASE( test_default_constructor_persistence )
 {
-   cout << "ANode:: ...test_migration_restore_def_con_3_0_1\n";
+   cout << "ANode:: ...test_default_constructor_persistence\n";
 
-   std::string file_name = File::test_data("ANode/test/data/migration/default_constructor/","ANode");
+   std::string file_name = File::test_data("ANode/test/data/","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);
+
+   DebugEquality debug_equality; // only as affect in DEBUG build
    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
+   fs::remove(file_name + "Defs.def");
+   fs::remove(file_name + "Suite.def");
+   fs::remove(file_name + "Family.def");
+   fs::remove(file_name + "Task.def");
+   fs::remove(file_name + "Limit.def");
+}
 
-BOOST_AUTO_TEST_CASE( test_migration_restore_boost_checkpt_file )
+BOOST_AUTO_TEST_CASE( test_compare_boost_and_defs_checkpt_file )
 {
-   cout << "ANode:: ...test_migration_restore_boost_checkpt_file\n";
+   cout << "ANode:: ...test_compare_boost_and_defs_checkpt_file\n";
 
-   std::string file_name = File::test_data("ANode/test/data/migration/fixture/","ANode");
+   std::string file_name = File::test_data("ANode/test/data/","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.checkpt");
+   MyDefsFixture fixture;
 
-   // 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.checkpt",fixture.fixtureDefsFile());
-#else
-   Ecf::set_debug_equality(true);
+   fixture.fixtureDefsFile().save_as_checkpt(file_name + "defs.checkpt");
+
+
+   DebugEquality debug_equality; // only as affect in DEBUG build
    do_restore<Defs>(file_name + "boost.checkpt",fixture.fixtureDefsFile());
-   Ecf::set_debug_equality(false);
-#endif
-}
 
+   Defs defs;
+   defs.restore( file_name + "defs.checkpt" );
+   BOOST_CHECK_MESSAGE(defs == fixture.fixtureDefsFile()," ");
+
+   fs::remove(file_name + "boost.checkpt");
+   fs::remove(file_name + "defs.checkpt");
+}
 
 BOOST_AUTO_TEST_SUITE_END()
 
diff --git a/ANode/test/TestPersistence.cpp b/ANode/test/TestPersistence.cpp
index 4bc5e7f..9633774 100644
--- a/ANode/test/TestPersistence.cpp
+++ b/ANode/test/TestPersistence.cpp
@@ -31,10 +31,10 @@ BOOST_FIXTURE_TEST_SUITE( NodeTestSuite, MyDefsFixture )
 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);
+	fixtureDefs.boost_save_as_checkpt(check_pt_file,at);
 
 	Defs restoredDefs;
-	restoredDefs.restore_from_checkpt(check_pt_file,at);
+	restoredDefs.boost_restore_from_checkpt(check_pt_file,at);
 
 	bool theyCompare = (restoredDefs == fixtureDefs);
 	if (!theyCompare) {
@@ -81,4 +81,20 @@ BOOST_AUTO_TEST_CASE( test_node_tree_persistence_text )
 }
 #endif
 
+
+BOOST_AUTO_TEST_CASE( test_node_defs_persistence  )
+{
+   cout << "ANode:: ...test_node_defs_persistence\n" ;
+
+   const Defs& defs = fixtureDefsFile();
+   std::vector<node_ptr> all_nodes;
+   defs.get_all_nodes(all_nodes);
+   BOOST_REQUIRE_MESSAGE(all_nodes.size()>0,"Expected nodes");
+   for(size_t i = 0; i < all_nodes.size(); i++) {
+      std::string node_as_defs_string = all_nodes[i]->print(PrintStyle::MIGRATE);
+      node_ptr the_copy = Node::create(node_as_defs_string);
+      BOOST_REQUIRE_MESSAGE(the_copy,"Failed to create node " << all_nodes[i]->absNodePath() << " from string " << node_as_defs_string);
+      BOOST_REQUIRE_MESSAGE(*the_copy == *all_nodes[i],"Nodes not the same");
+   }
+}
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/ANode/test/TestReplace.cpp b/ANode/test/TestReplace.cpp
index be4205a..c1a94d6 100644
--- a/ANode/test/TestReplace.cpp
+++ b/ANode/test/TestReplace.cpp
@@ -281,9 +281,8 @@ BOOST_AUTO_TEST_CASE( test_replace_preserves_begun_status )
    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
+   DebugEquality debug_equality; // 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 )
@@ -440,7 +439,7 @@ BOOST_AUTO_TEST_CASE( test_replace_order_preserved_for_family )
    }
 
    std::string errorMsg;
-   Ecf::set_debug_equality(true);  // only has affect in DEBUG build
+   DebugEquality debug_equality; // only as affect in DEBUG build
    {
       ExpectStateChange expect_state_change;
       BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/f1",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
@@ -456,7 +455,6 @@ BOOST_AUTO_TEST_CASE( test_replace_order_preserved_for_family )
       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 )
@@ -490,7 +488,7 @@ BOOST_AUTO_TEST_CASE( test_replace_order_preserved_for_task )
    }
 
    std::string errorMsg;
-   Ecf::set_debug_equality(true);  // only has affect in DEBUG build
+   DebugEquality debug_equality; // only as affect in DEBUG build
    {
       ExpectStateChange expect_state_change;
       BOOST_REQUIRE_MESSAGE( serverDefs.replaceChild("/suite1/f1/t1",clientDef,true/*create nodes as needed*/, false/*force*/, errorMsg), errorMsg  );
@@ -506,7 +504,6 @@ BOOST_AUTO_TEST_CASE( test_replace_order_preserved_for_task )
       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 )
diff --git a/ANode/test/TestSingleExprParse.cpp b/ANode/test/TestSingleExprParse.cpp
index 7468386..87f2c5d 100644
--- a/ANode/test/TestSingleExprParse.cpp
+++ b/ANode/test/TestSingleExprParse.cpp
@@ -44,8 +44,8 @@ BOOST_AUTO_TEST_CASE( test_single_expression )
     // value.second = result of expected evaluation
 	map<string,std::pair<string,bool> > exprMap;
 
-   exprMap["/s/f/t<flag>late"] = std::make_pair(AstFlag::stype(),false);
-   exprMap["/s/f/t:late"] = std::make_pair(AstFlag::stype(),false);
+   exprMap[":var == 0"] = std::make_pair(AstEqual::stype(),true);
+   exprMap[":var != 1"] = std::make_pair(AstNotEqual::stype(),true);
 
  	std::pair<string, std::pair<string,bool> > p;
 	BOOST_FOREACH(p, exprMap ) {
diff --git a/ANode/test/TestVariableGeneration.cpp b/ANode/test/TestVariableGeneration.cpp
index 08f835f..069da5f 100644
--- a/ANode/test/TestVariableGeneration.cpp
+++ b/ANode/test/TestVariableGeneration.cpp
@@ -11,6 +11,8 @@
 // nor does it submit to any jurisdiction.
 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
 #include <boost/test/unit_test.hpp>
+#include <boost/lexical_cast.hpp>
+
 #include <iostream>
 
 #include "Defs.hpp"
@@ -18,6 +20,7 @@
 #include "Family.hpp"
 #include "Task.hpp"
 #include "Str.hpp"
+#include "Cal.hpp"
 
 using namespace std;
 using namespace ecf;
@@ -83,10 +86,16 @@ BOOST_AUTO_TEST_CASE( test_generated_variables )
    findParentVariableValue(t,"ECF_DATE","");
    findParentVariableValue(t,"ECF_CLOCK","");
    findParentVariableValue(t,"ECF_TIME","");
+   findParentVariableValue(t,"ECF_JULIAN","");
 
    // Test repeat generated variables
    findParentVariableValue(t,"AEnum","AA");
    findParentVariableValue(t,"YMD","20090101");
+   findParentVariableValue(t,"YMD_YYYY","2009");
+   findParentVariableValue(t,"YMD_MM","1");
+   findParentVariableValue(t,"YMD_DD","1");
+   findParentVariableValue(t,"YMD_DOW","4");
+   findParentVariableValue(t,"YMD_JULIAN",boost::lexical_cast<std::string>(Cal::date_to_julian(20090101)));
    findParentVariableValue(t,"RepeatInteger","10");
 }
 
diff --git a/ANode/test/TestVariableSubstitution.cpp b/ANode/test/TestVariableSubstitution.cpp
index c9bc484..a296891 100644
--- a/ANode/test/TestVariableSubstitution.cpp
+++ b/ANode/test/TestVariableSubstitution.cpp
@@ -401,10 +401,11 @@ BOOST_AUTO_TEST_CASE( test_server_variable_substitution )
    }
 }
 
-BOOST_AUTO_TEST_CASE( test_generated_variable_substitution_of_ECF_OUT )
+BOOST_AUTO_TEST_CASE( test_generated_variable_substitution )
 {
    // test that if ECF_OUT is defined using %, then we perform variable substitution
-   std::cout <<  "ANode:: ...test_generated_variable_substitution_of_ECF_OUT\n";
+   // test that if ECF_JOBOUT or ECF_JOB are specified, they take priority over the generated variables
+   std::cout <<  "ANode:: ...test_generated_variable_substitution\n";
 
    Defs defs;
    suite_ptr s = defs.add_suite("suite");
@@ -417,11 +418,15 @@ BOOST_AUTO_TEST_CASE( test_generated_variable_substitution_of_ECF_OUT )
    f1->addVariable(Variable("PATH2","/fred/bill/joe2"));
    task_ptr t1 = f1->add_task("t1");
    t1->addVariable(Variable("ECF_OUT","%PATH2%"));
+   task_ptr t2 = f1->add_task("t2");
+   t2->addVariable(Variable("ECF_JOBOUT","ECFLOW-999"));
+   t2->addVariable(Variable("ECF_JOB","ECFLOW-999"));
 
    // begin_all
    defs.beginAll();
    t->update_generated_variables();
    t1->update_generated_variables();
+   t2->update_generated_variables();
 
    // cout << defs;
 
@@ -433,6 +438,15 @@ BOOST_AUTO_TEST_CASE( test_generated_variable_substitution_of_ECF_OUT )
    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);
+
+
+   // ECFLOW-999  make sure that if ECF_JOBOUT or ECF_JOB are overridden, they take priority over
+   // the generated variables of the same name
+   std::string cmd = Ecf::JOB_CMD();
+   BOOST_CHECK_MESSAGE(t2->variableSubsitution(cmd)," variableSubsitution failed for " << Ecf::JOB_CMD());
+
+   std::string expected = "ECFLOW-999 1> ECFLOW-999 2>&1";
+   BOOST_CHECK_MESSAGE( cmd == expected,"variable substitution failed expected " << expected << " but found " << cmd);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/ANode/test/TestZombies.cpp b/ANode/test/TestZombies.cpp
index 30befe4..944665f 100644
--- a/ANode/test/TestZombies.cpp
+++ b/ANode/test/TestZombies.cpp
@@ -44,14 +44,7 @@ BOOST_AUTO_TEST_CASE( test_zombies )
    }
 
    // 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);
+   std::vector<ecf::Child::CmdType> child_cmds = ecf::Child::list();
    {
       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());
diff --git a/ANode/test/Test_ECFLOW-247.cpp b/ANode/test/Test_ECFLOW-247.cpp
index dfa7847..8d78082 100644
--- a/ANode/test/Test_ECFLOW-247.cpp
+++ b/ANode/test/Test_ECFLOW-247.cpp
@@ -40,7 +40,7 @@ BOOST_AUTO_TEST_CASE( test_ECFLOW_247 )
    task_ptr t3 = f1->add_task("t3");
    task_ptr t4 = f1->add_task("t4");
 
-   PrintStyle::setStyle( PrintStyle::MIGRATE);
+   PrintStyle style( PrintStyle::MIGRATE);
    {
       defs->beginAll();
       t1->set_state(NState::COMPLETE);
diff --git a/ANode/test/data/migration/default_constructor/Defs.def b/ANode/test/data/migration/default_constructor/Defs.def
deleted file mode 100644
index 132049b..0000000
--- a/ANode/test/data/migration/default_constructor/Defs.def
+++ /dev/null
@@ -1 +0,0 @@
-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/ANode/test/data/migration/default_constructor/Family.def b/ANode/test/data/migration/default_constructor/Family.def
deleted file mode 100644
index 1d8b35f..0000000
--- a/ANode/test/data/migration/default_constructor/Family.def
+++ /dev/null
@@ -1,2 +0,0 @@
-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/ANode/test/data/migration/default_constructor/Limit.def b/ANode/test/data/migration/default_constructor/Limit.def
deleted file mode 100644
index 43b219a..0000000
--- a/ANode/test/data/migration/default_constructor/Limit.def
+++ /dev/null
@@ -1,2 +0,0 @@
-22 serialization::archive 9 1 0
-0 0  0 0 0 0 0 0
diff --git a/ANode/test/data/migration/default_constructor/Suite.def b/ANode/test/data/migration/default_constructor/Suite.def
deleted file mode 100644
index a2508b2..0000000
--- a/ANode/test/data/migration/default_constructor/Suite.def
+++ /dev/null
@@ -1,2 +0,0 @@
-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/ANode/test/data/migration/default_constructor/Task.def b/ANode/test/data/migration/default_constructor/Task.def
deleted file mode 100644
index 5f719fe..0000000
--- a/ANode/test/data/migration/default_constructor/Task.def
+++ /dev/null
@@ -1,2 +0,0 @@
-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/ANode/test/data/migration/fixture/boost.checkpt b/ANode/test/data/migration/fixture/boost.checkpt
deleted file mode 100644
index 3aaa477..0000000
--- a/ANode/test/data/migration/fixture/boost.checkpt
+++ /dev/null
@@ -1,77 +0,0 @@
-22 serialization::archive 10 0 0 0 0 0 0 2 0 0 0 0 16 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 9 ECF_LISTS 23 eurydice.3141.ecf.lists 17 ECF_CHECKINTERVAL 3 120 13 ECF_CHECKMODE 13 CH [...]
-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 300 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 300 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 20160419 0 9 3 12 0 8 20160419 0 9 3 12 0 0 0 0 0 0 0 8 20160419 0 9 3 12 0 8 20160419 0 9 3 12 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 20160419 0 9 3 12 0 8 20160419 0 9 3 12 0 0 0 0 0 0 0 8 20160419 0 9 3 12 0 8 20160419 0 9 3 12 0 0 0 1 0 0 0 0 0 0 0
diff --git a/AParser/src/DefsStructureParser.hpp b/AParser/src/DefsStructureParser.hpp
deleted file mode 100644
index 9bcec45..0000000
--- a/AParser/src/DefsStructureParser.hpp
+++ /dev/null
@@ -1,79 +0,0 @@
-#ifndef DEFS_STRUCTURE_PARSER_HPP_
-#define DEFS_STRUCTURE_PARSER_HPP_
-
-//============================================================================
-// Name        :
-// Author      : Avi
-// Revision    : $Revision: #12 $ 
-//
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0 
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
-// In applying this licence, ECMWF does not waive the 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/AParser/test/ParseTimer.cpp b/AParser/test/ParseTimer.cpp
deleted file mode 100644
index 915abed..0000000
--- a/AParser/test/ParseTimer.cpp
+++ /dev/null
@@ -1,224 +0,0 @@
-//============================================================================
-// Name        :
-// Author      : Avi
-// Revision    : $Revision$
-//
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not waive the 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/AParser/test/TestJobGenPerf.log b/AParser/test/TestJobGenPerf.log
deleted file mode 100644
index 15a72e8..0000000
--- a/AParser/test/TestJobGenPerf.log
+++ /dev/null
@@ -1 +0,0 @@
-ERR:[14:56:14 5.1.2017] Jobs::generate: job generation time(61 seconds) is greater than job submission interval of 20 seconds!!
diff --git a/Base/CMakeLists.txt b/Base/CMakeLists.txt
index 677427f..03837cc 100644
--- a/Base/CMakeLists.txt
+++ b/Base/CMakeLists.txt
@@ -9,6 +9,7 @@
  src/Client.cpp
  src/ServerReply.cpp
  src/Connection.cpp
+ src/stc/DefsCache.cpp
  src/stc/DefsCmd.cpp
  src/stc/PreAllocatedReply.cpp
  src/stc/SStringVecCmd.cpp
@@ -71,12 +72,11 @@ ecbuild_add_library( TARGET   base
                      NOINSTALL
                      TYPE     STATIC
                      SOURCES  ${srcs}
-                     LIBS     libparser node nodeattr core
+                     LIBS     node nodeattr core
                      INCLUDES src
                               ../ACore/src
                               ../ANattr/src
                               ../ANode/src
-                              ../AParser/src
                               ../Base/src
                               ../Base/src/cts
                               ../Base/src/stc
@@ -94,6 +94,7 @@ list( APPEND test_srcs
    test/TestForceCmd.cpp
    test/TestFreeDepCmd.cpp
    test/TestLimit.cpp
+   test/TestLoadDefsCmd.cpp
    test/TestLogCmd.cpp
    test/TestMeterCmd.cpp
    test/TestProgramOptions.cpp
diff --git a/Base/Jamfile.jam b/Base/Jamfile.jam
index 7d75ea1..edad710 100644
--- a/Base/Jamfile.jam
+++ b/Base/Jamfile.jam
@@ -10,11 +10,9 @@
 #
 project theBase ;
 
-
 use-project theCore     : ../ACore ;
 use-project theNodeAttr : ../ANattr ;
-use-project theNode     : ../ANode ;
-use-project theParser   : ../AParser ;
+use-project theNode     : ../ANode ;  
 
 # The <include> means we will automatically add this directory to the include path
 # of any other target that uses this lib
@@ -22,7 +20,6 @@ use-project theParser   : ../AParser ;
 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
@@ -31,7 +28,6 @@ lib base : [ glob src/*.cpp ] [ glob src/cts/*.cpp ] [ glob src/stc/*.cpp ]
            <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
@@ -56,7 +52,6 @@ exe u_base : [ glob test/*.cpp : test/TestJobGenPerf.cpp ]
            /theCore//core
            /theNodeAttr//nodeattr
            /theNode//node
-           /theParser//libparser
            base
            /site-config//boost_system
            /site-config//boost_serialization
@@ -78,7 +73,6 @@ exe perf_job_gen : test/TestJobGenPerf.cpp
            /theCore//core
            /theNodeAttr//nodeattr
            /theNode//node
-           /theParser//libparser
            base
            /site-config//boost_system
            /site-config//boost_serialization
diff --git a/Base/src/ClientToServerRequest.hpp b/Base/src/ClientToServerRequest.hpp
index 0baa783..e330746 100644
--- a/Base/src/ClientToServerRequest.hpp
+++ b/Base/src/ClientToServerRequest.hpp
@@ -39,6 +39,8 @@ public:
    bool terminateRequest() const { return (cmd_.get()) ? cmd_->terminate_cmd() : false;  }
    bool groupRequest() const { return (cmd_.get()) ? cmd_->group_cmd() : false;  }
 
+   void cleanup() { if (cmd_.get()) cmd_->cleanup();} // reclaim memory *AFTER* command has run
+
    /// Used by boost test, to verify persistence
    bool operator==(const ClientToServerRequest& rhs) const;
 
diff --git a/Base/src/Connection.hpp b/Base/src/Connection.hpp
index afa8063..cb132e8 100644
--- a/Base/src/Connection.hpp
+++ b/Base/src/Connection.hpp
@@ -252,9 +252,10 @@ private:
             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);
+            log_error(archive_data.c_str()); // ECFLOW-1025
 			   if (current_archive_version != archive_version_in_data ) {
+			      log_error("Connection::handle_read_data archive version miss-match!"); // ECFLOW-1025
 			      if (ecf::boost_archive::replace_version(archive_data,current_archive_version)) {
-
 			         try {
 			            ecf::restore_from_string(archive_data,t);
 			            // It worked
@@ -264,7 +265,6 @@ private:
 			         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);
diff --git a/Base/src/ServerToClientResponse.hpp b/Base/src/ServerToClientResponse.hpp
index ba54c2c..a70e6dc 100644
--- a/Base/src/ServerToClientResponse.hpp
+++ b/Base/src/ServerToClientResponse.hpp
@@ -31,6 +31,8 @@ public:
 
    std::ostream& print(std::ostream& os) const;
 
+   void cleanup() { if (stc_cmd_.get())  stc_cmd_->cleanup();} // reclaim memory *AFTER* command has run
+
    /// 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;
diff --git a/Base/src/ZombieCtrl.hpp b/Base/src/ZombieCtrl.hpp
index 6aa2b78..0b55659 100644
--- a/Base/src/ZombieCtrl.hpp
+++ b/Base/src/ZombieCtrl.hpp
@@ -106,6 +106,7 @@ public:
 	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*);
+    bool remove_by_path(const std::string& path_to_task);
 
 	/// Query
  	const Zombie& find(const std::string& path_to_task, const std::string& process_or_remote_id, const std::string& password) const;
@@ -136,7 +137,6 @@ private:
 	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_;
 };
diff --git a/Base/src/cts/AlterCmd.cpp b/Base/src/cts/AlterCmd.cpp
index 701db90..c11c3d4 100644
--- a/Base/src/cts/AlterCmd.cpp
+++ b/Base/src/cts/AlterCmd.cpp
@@ -755,8 +755,18 @@ void AlterCmd::createDelete( Cmd_ptr& cmd, const std::vector<std::string>& optio
 			break;
 		}
 		case AlterCmd::DEL_INLIMIT:  {
-			if (!name.empty()) InLimit check(name);  // will throw if not valid
-			break;
+		   if (!name.empty()) {
+		      // name can be:
+		      //    limit_name
+		      //    /path/to/limit:limit_name
+		      string path_to_limit; // This can be empty
+		      string limitName;
+		      if ( !Extract::pathAndName( name, path_to_limit, limitName ) ) {
+		         throw std::runtime_error( "AlterCmd::DEL_INLIMIT : Invalid inlimit : " +  name );
+		      }
+            InLimit check(limitName,path_to_limit);  // will throw if not valid
+		   }
+		   break;
 		}
 		case AlterCmd::DEL_ZOMBIE:  {
 			if (!Child::valid_zombie_type(name)) {
@@ -993,43 +1003,37 @@ void AlterCmd::createChange( Cmd_ptr& cmd, std::vector<std::string>& options, st
       break; }
 
 	case AlterCmd::TRIGGER: {
-		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];
+	   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() );
-		}
+	   std::string error_msg = "AlterCmd: change trigger:";
+	   std::auto_ptr<AstTop> ast = Expression::parse_no_throw(name,error_msg);
+	   if (!ast.get()) {
+	      ss << error_msg << "\n" << dump_args(options,paths) << "\n";
+	      throw std::runtime_error( ss.str() );
+	   }
 		break; }
 
 	case AlterCmd::COMPLETE: {
-		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];
+	   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() );
-		}
+	   std::string error_msg = "AlterCmd: change complete:";
+	   std::auto_ptr<AstTop> ast = Expression::parse_no_throw(name,error_msg);
+	   if (!ast.get()) {
+	      ss << error_msg << "\n" << dump_args(options,paths) << "\n";
+	      throw std::runtime_error( ss.str() );
+	   }
 		break;}
 
 	case AlterCmd::REPEAT: {
diff --git a/Base/src/cts/CFileCmd.cpp b/Base/src/cts/CFileCmd.cpp
index 6b17f82..c0adf28 100644
--- a/Base/src/cts/CFileCmd.cpp
+++ b/Base/src/cts/CFileCmd.cpp
@@ -148,37 +148,46 @@ STC_Cmd_ptr CFileCmd::doHandleRequest(AbstractServer* as) const
 
 			case CFileCmd::JOBOUT: {
 
-			   // ECF_JOBOUT is either constructed from ECF_OUT *OR* ECF_HOME/ECF_NAME.ECF_TRYNO
+			   // ECF_JOBOUT is either constructed from:
+			   // - (generated variable) ECF_HOME/ECF_NAME.ECF_TRYNO (common/default)
+			   // - (generated variable) ECF_OUT/ECF_NAME.ECF_TRYNO  (common, user must create any directories)
+			   // - (user variable)                                  (rare, but if defined try first,user must create any directories)
 			   // 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 )
 
+            // First try user variable, if defined this has priority ECFLOW-999
+			   std::stringstream ss;
+            std::string user_jobout;
+            if (submittable->findParentUserVariableValue(Str::ECF_JOBOUT(), user_jobout)) {
+               if (File::open(user_jobout ,fileContents))  break;
+               ss << "Failed to open user specified job-out(ECF_JOBOUT='" << user_jobout << "') ";
+            }
+
 				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();
+				   std::string ecfhome_jobout;
+				   submittable->findParentUserVariableValue(Str::ECF_HOME(), ecfhome_jobout);
+				   ecfhome_jobout += submittable->absNodePath();
+				   ecfhome_jobout += ".";
+				   ecfhome_jobout += submittable->tryNo();
 
-				   if ( backup_jobout != ecf_jobout_gen_var.theValue()) {
+				   if ( ecfhome_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_ << " (" << strerror(errno) << ")";
+				      if (!File::open(ecfhome_jobout,fileContents)) {
+				         ss << "Failed to open the job-out (ECF_JOBOUT=ECF_OUT/ECF_NAME.ECF_TRYNO='" << ecf_jobout_gen_var.theValue() << "') ";
+				         ss << "*AND* (ECF_JOBOUT=ECF_HOME/ECF_NAME.ECF_TRYNO='" << ecfhome_jobout << "')";
+				         ss << " for task " << pathToNode_ << " (" << strerror(errno) << ")";
 				         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_;
+                  ss << "Failed to open the job-out(ECF_JOBOUT=ECF_HOME/ECF_NAME.ECF_TRYNO='" << ecf_jobout_gen_var.theValue() << "') ";
+                  ss << " for task " << pathToNode_ << " (" << strerror(errno) << ")";
                   throw std::runtime_error( ss.str() ) ;
 				   }
 				}
diff --git a/Base/src/cts/ClientToServerCmd.hpp b/Base/src/cts/ClientToServerCmd.hpp
index c23f009..85cf02f 100644
--- a/Base/src/cts/ClientToServerCmd.hpp
+++ b/Base/src/cts/ClientToServerCmd.hpp
@@ -69,6 +69,9 @@ public:
    /// doHandleRequest. This function can throw exceptions. std::runtime_error
    STC_Cmd_ptr handleRequest(AbstractServer*) const;
 
+   /// After handleRequest() has run, this function can be used reclaim memory
+   virtual void cleanup() {}
+
    /// Returns true if handleRequest is testable. Only used in TEST
    virtual bool handleRequestIsTestable() const { return true ;}
 
@@ -883,6 +886,7 @@ public:
 private:
    virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
    virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const;
+   virtual void cleanup() { std::vector<std::string>().swap(paths_);} /// run in the server, after handlerequest
 
    std::ostream& my_print(std::ostream& os, const std::vector<std::string>& paths) const;
 
@@ -1086,6 +1090,7 @@ private:
 
    virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
    virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const;
+   virtual void cleanup() { std::vector<std::string>().swap(paths_);} /// run in the server, after doHandleRequest
 
 private:
    mutable std::vector<std::string>  paths_;  // mutable to allow swap to clear & reclaim memory, as soon as possible
@@ -1169,6 +1174,7 @@ private:
 
    virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
    virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const;
+   virtual void cleanup() { std::vector<std::string>().swap(paths_);} /// run in the server, after doHandleRequest
 
 private:
    std::vector<std::string> paths_;
@@ -1228,7 +1234,7 @@ private:
 // 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 std::string& defs_filename,bool force = false,bool check_only = false/* not persisted */,bool print = false/* not persisted */);
 
    LoadDefsCmd(const defs_ptr& defs, bool force = false)
    : force_(force), defs_(defs) {}
@@ -1248,7 +1254,7 @@ public:
    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);
+   static Cmd_ptr create(const std::string& defs_filename,bool force,bool check_only,bool print,AbstractClientEnv* clientEnv);
 
 private:
    static const char* arg();  // used for argument parsing
@@ -1360,6 +1366,7 @@ private:
 
    virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
    virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const;
+   virtual void cleanup() { std::vector<std::string>().swap(paths_);} /// run in the server, after doHandleRequest
 
 private:
    std::vector<std::string> paths_;
@@ -1422,6 +1429,7 @@ private:
 
    virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
    virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const;
+   virtual void cleanup() { std::vector<std::string>().swap(paths_);} /// run in the server, after doHandleRequest
 
 private:
    std::vector<std::string> paths_;
@@ -1520,6 +1528,7 @@ private:
    virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
    STC_Cmd_ptr alter_server_state(AbstractServer*) const;
    virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const;
+   virtual void cleanup() { std::vector<std::string>().swap(paths_);} /// run in the server, after doHandleRequest
 
    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;
@@ -1661,6 +1670,7 @@ private:
 
    virtual STC_Cmd_ptr doHandleRequest(AbstractServer*) const;
    virtual bool authenticate(AbstractServer*, STC_Cmd_ptr&) const;
+   virtual void cleanup(){ std::vector<std::string>().swap(user_file_contents_);} /// run in the server, after doHandleRequest
 
 private:
    EditType      edit_type_;
diff --git a/Base/src/cts/CtsApi.cpp b/Base/src/cts/CtsApi.cpp
index 43992f8..8d6cf12 100644
--- a/Base/src/cts/CtsApi.cpp
+++ b/Base/src/cts/CtsApi.cpp
@@ -168,7 +168,7 @@ std::vector<std::string> CtsApi::news(unsigned int client_handle, unsigned int s
 }
 const char* CtsApi::newsArg()  { return "news"; }
 
-std::vector<std::string> CtsApi::loadDefs(const std::string& filePath, bool force, bool check_only) {
+std::vector<std::string> CtsApi::loadDefs(const std::string& filePath,bool force,bool check_only,bool print){
 
    std::string ret = "--load="; ret += filePath;
 
@@ -176,6 +176,7 @@ std::vector<std::string> CtsApi::loadDefs(const std::string& filePath, bool forc
    retVec.push_back(ret);
    if (force) retVec.push_back("force");
    if (check_only) retVec.push_back("check_only");
+   if (print) retVec.push_back("print");
    return retVec;
 }
 const char* CtsApi::loadDefsArg() { return "load"; }
diff --git a/Base/src/cts/CtsApi.hpp b/Base/src/cts/CtsApi.hpp
index a7f19de..194f1b3 100644
--- a/Base/src/cts/CtsApi.hpp
+++ b/Base/src/cts/CtsApi.hpp
@@ -33,7 +33,7 @@ public:
 
 	// 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::vector<std::string> loadDefs(const std::string& filePath,bool force,bool check_only,bool print); // check_only & print are client side 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 = "");
diff --git a/Base/src/cts/CtsNodeCmd.cpp b/Base/src/cts/CtsNodeCmd.cpp
index 1d0621c..e49b1e2 100644
--- a/Base/src/cts/CtsNodeCmd.cpp
+++ b/Base/src/cts/CtsNodeCmd.cpp
@@ -248,7 +248,9 @@ static const char* get_state_desc() {
 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"
+            "This is the format used in the check point file, but with indentation.\n"
+            "Since this is essentially the defs format with state in the comments,"
+            "it 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"
@@ -257,37 +259,7 @@ const char* migrate_desc() {
             "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=yes\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"
+            "Show trigger AST         No     Yes          No\n\n"
             "Usage:\n"
             "    --migrate         # show all suites\n"
             "    --migrate=/s1     # show state for suite s1\n"
diff --git a/Base/src/cts/LoadDefsCmd.cpp b/Base/src/cts/LoadDefsCmd.cpp
index 9c8af78..5928d30 100644
--- a/Base/src/cts/LoadDefsCmd.cpp
+++ b/Base/src/cts/LoadDefsCmd.cpp
@@ -21,14 +21,16 @@
 #include "CtsApi.hpp"
 #include "Defs.hpp"
 #include "Log.hpp"
-#include "DefsStructureParser.hpp"
+#include "File.hpp"
+#include "PrintStyle.hpp"
 
 using namespace ecf;
 using namespace std;
 using namespace boost;
 namespace po = boost::program_options;
 
-LoadDefsCmd::LoadDefsCmd(const std::string& defs_filename, bool force)
+
+LoadDefsCmd::LoadDefsCmd(const std::string& defs_filename, bool force, bool check_only, bool print)
 : force_(force), defs_(Defs::create()), defs_filename_(defs_filename)
 {
    if (defs_filename_.empty()) {
@@ -38,17 +40,49 @@ LoadDefsCmd::LoadDefsCmd(const std::string& defs_filename, bool force)
    }
 
    // 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();
+   if (defs_->restore(defs_filename_, errMsg , warningMsg) ) {
+
+      if (print) {
+         PrintStyle print_style(PrintStyle::MIGRATE);
+         cout << defs_;
+      }
 
-      // Out put any warning to standard output
+      // Output any warning to standard output
       cout << warningMsg;
    }
    else {
-      std::stringstream ss; ss << "\nLoadDefsCmd::LoadDefsCmd.  Failed to parse file " << defs_filename_ << "\n";
+      // Check if its a boost file format. (could be old checkpoint file)
+      // When default version of ecflow is 4.7  this section could be removed.
+      // i.e. BECAUSE the checkpoint will be in defs file format. TODO
+      std::string error_msg;
+      std::string first_line = File::get_first_n_lines(defs_filename_, 1, error_msg);
+      if (!first_line.empty() && error_msg.empty()) {
+         if (first_line.find("22 serialization::archive") == 0) {   // boost file format
+
+            // Can be use to check for corruption in boost based checkpoint files.
+            defs_->boost_restore_from_checkpt(defs_filename_);
+
+            if (print) {
+               PrintStyle print_style(PrintStyle::MIGRATE);
+               cout << defs_;
+            }
+
+            if (check_only) {
+               // Note: there are no extern's in boost checkpoint, hence may fail some checking
+               //       Hence only do checking if option check_only used
+               errMsg.clear();warningMsg.clear();
+               if (!defs_->check( errMsg, warningMsg)) {
+                   std::stringstream ss; ss << "LoadDefsCmd::LoadDefsCmd: Checking failed for boost file " << defs_filename_ << "\n";
+                   ss << errMsg;
+                   throw std::runtime_error( ss.str() );
+               }
+            }
+            return;
+         }
+      }
+
+      std::stringstream ss; ss << "\nLoadDefsCmd::LoadDefsCmd. Failed to parse file " << defs_filename_ << "\n";
       ss << errMsg;
       throw std::runtime_error( ss.str() );
    }
@@ -71,8 +105,8 @@ bool LoadDefsCmd::equals(ClientToServerCmd* rhs) const
 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.
@@ -80,8 +114,16 @@ STC_Cmd_ptr LoadDefsCmd::doHandleRequest(AbstractServer* as) const
 	   // *NOTE* Externs are not persisted. Hence calling check() will report
 	   // all errors, references are not resolved.
 		as->updateDefs(defs_,force_);
+
+#ifdef DEBUG
+      LOG_ASSERT(defs_->suiteVec().size() == 0,"Expected suites to be transferred to server defs");
+#endif
  	}
 
+#ifdef DEBUG
+   LOG_ASSERT(as->defs()->externs().size() == 0,"Expected server to have no externs");
+#endif
+
 	return PreAllocatedReply::ok_cmd();
 }
 
@@ -89,25 +131,28 @@ 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("<in-memory-defs>",force_,false/*check_only*/,false/*print*/)));
    }
-   return user_cmd(os,CtsApi::to_string(CtsApi::loadDefs(defs_filename_,force_,false/*check_only*/)));
+   return user_cmd(os,CtsApi::to_string(CtsApi::loadDefs(defs_filename_,force_,false/*check_only*/,false/*print*/)));
 }
 
 const char* LoadDefsCmd::arg()  { return CtsApi::loadDefsArg();}
 const char* LoadDefsCmd::desc() {
-   return   "Check and load definition file into server.\n"
+   return   "Check and load definition or checkpoint 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"
+            "This command can also be used to load a checkpoint file into the server\n"
+            "  arg1 = path to the definition file or checkpoint file\n"
+            "  arg2 = (optional) [ force | check_only | print ]   # default = false for all\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"
+            "--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 in the server\n"
+            "--load=/my/home/exotic.def check_only    # Just check, don't send to server\n"
+            "--load=host1.3141.check                  # Load checkpoint file to the server\n"
+            "--load=host1.3141.check print check_only # print definition to standard out in defs format\n"
             ;
 }
 
@@ -123,22 +168,24 @@ void LoadDefsCmd::create( 	Cmd_ptr& cmd,
 	if (clientEnv->debug()) dumpVecArgs(LoadDefsCmd::arg(),args);
 
 	bool check_only = false;
-	bool force =  false;
+	bool force = false;
+	bool print = 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 if (args[i] == "check_only") check_only = true;
+      else if (args[i] == "print") print = 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 = LoadDefsCmd::create(defs_filename,force,check_only,print,clientEnv );
 }
 
-Cmd_ptr LoadDefsCmd::create(const std::string& defs_filename, bool force, bool check_only, AbstractClientEnv* clientEnv)
+Cmd_ptr LoadDefsCmd::create(const std::string& defs_filename, bool force, bool check_only, bool print, 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);
+   boost::shared_ptr<LoadDefsCmd> load_cmd = boost::make_shared<LoadDefsCmd>(defs_filename,force,check_only,print);
 
    // Don't send to server if checking, i.e cmd not set
    if (check_only) return Cmd_ptr();
diff --git a/Base/src/cts/PlugCmd.cpp b/Base/src/cts/PlugCmd.cpp
index 32280e2..f8a8488 100644
--- a/Base/src/cts/PlugCmd.cpp
+++ b/Base/src/cts/PlugCmd.cpp
@@ -311,8 +311,6 @@ STC_Cmd_ptr MoveCmd::doHandleRequest(AbstractServer* as) const
    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_;
@@ -359,27 +357,14 @@ STC_Cmd_ptr MoveCmd::doHandleRequest(AbstractServer* as) const
       // 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 ) ;
-      }
+      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();
+   as->defs()->set_most_significant_state();
 
    // Ownership for sourceSuite_ has been passed on.
    sourceSuite_ = NULL;
diff --git a/Base/src/cts/ReplaceNodeCmd.cpp b/Base/src/cts/ReplaceNodeCmd.cpp
index a6d8b87..7373d1c 100644
--- a/Base/src/cts/ReplaceNodeCmd.cpp
+++ b/Base/src/cts/ReplaceNodeCmd.cpp
@@ -20,7 +20,6 @@
 #include "AbstractClientEnv.hpp"
 #include "CtsApi.hpp"
 #include "Defs.hpp"
-#include "DefsStructureParser.hpp"
 
 using namespace ecf;
 using namespace std;
@@ -62,9 +61,8 @@ ReplaceNodeCmd::ReplaceNodeCmd(const std::string& node_path, bool createNodesAsN
   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) ) {
+   if ( ! clientDefs_->restore(path_to_defs, errMsg , warningMsg) ) {
       std::stringstream ss;
       ss << "ReplaceNodeCmd::ReplaceNodeCmd: Could not parse file " << path_to_defs << " : " << errMsg;
       throw std::runtime_error( ss.str() );
diff --git a/Base/src/cts/TaskCmds.cpp b/Base/src/cts/TaskCmds.cpp
index 8bd066a..90d6cd4 100644
--- a/Base/src/cts/TaskCmds.cpp
+++ b/Base/src/cts/TaskCmds.cpp
@@ -86,7 +86,8 @@ bool TaskCmd::authenticate(AbstractServer* as, STC_Cmd_ptr& theReply) const
 		(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 << ")";
+		std::stringstream ss;
+		ss << " zombie(*path*) : chd:" << ecf::Child::to_string(child_type()) << " : " << path_to_submittable_ << " : "<< process_or_remote_id_ << " : " << jobs_password_ << " : action(" << action_taken << ")";
 		log(Log::ERR,ss.str());
 		return false;
 	}
@@ -142,58 +143,69 @@ bool TaskCmd::authenticate(AbstractServer* as, STC_Cmd_ptr& theReply) const
       pid_missmatch = true;
    }
 
-   if ((child_type() == Child::INIT) && (submittable_->state() == NState::ACTIVE)) {
+   NState::State submittable_state = submittable_->state();
+   if ((child_type() == Child::INIT) && (submittable_state == NState::ACTIVE)) {
 #ifdef DEBUG_ZOMBIE
-      std::cout << ":(child_type() == Child::INIT) && submittable_->state() == NState::ACTIVE)";
+      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;
-         }
+         std::stringstream ss;
+         ss << " [ overloaded || --init*2 ] (pid & password match) : chd:" << ecf::Child::to_string(child_type()) << " : "  << path_to_submittable_ << " : already active : action(fob)";
+         log(Log::WAR, ss.str() );
+         theReply = PreAllocatedReply::ok_cmd();
+         return false;
       }
 
       submittable_allready_active = true;
    }
 
-   if ( submittable_->state() == NState::COMPLETE) {
+   if ( submittable_state == NState::COMPLETE) {
 #ifdef DEBUG_ZOMBIE
-      std::cout << ": submittable_->state() == NState::COMPLETE)";
+      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;
-         }
+         // Note: when a node completes, we clear tasks password and pid, to save memory on checkpt & network bandwidth
+         // (We could choose not to clear, This would allow us to disambiguate between 2/ and 3/ below). HOWEVER:
+         //
+         // How can this situation arise:
+         //   1/ Two calls to --complete  (rare)
+         //   2/ Overloaded server. Client send --complete to server, but it is overload and does not respond, the client then
+         //      times out. Server handles the request. When client tries again we get here. (possible)
+         //   3/ Zombie, two separate process. (possible, typically done by user action)
+         //
+         // For all three it should be safe to just fob:
+         //   1/ Two calls to --complete # Be forgiving
+         //   2/ Overloaded server       # The correct course of action
+         //   3/ zombie                  # The zombie has completed anyway, don't bother blocking it
+
+         submittable_->flag().clear(ecf::Flag::ZOMBIE);
+         as->zombie_ctrl().remove_by_path( path_to_submittable_ ); // remove any associated zombies
+
+         std::stringstream ss;
+         ss << " [ overloaded || zombie || --complete*2 ] : chd:" << ecf::Child::to_string(child_type()) << " : " << path_to_submittable_ ;
+         ss << " : already complete : action(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) {
+   if ( submittable_state == NState::ABORTED) {
 #ifdef DEBUG_ZOMBIE
-      std::cout << ": submittable_->state() == NState::ABORTED)";
+      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 )";
+         if (!password_missmatch && !pid_missmatch ) {
+            /// If there is an associated zombie, remove from the list
+            as->zombie_ctrl().remove( submittable_ );
+
+            std::stringstream ss;
+            ss << " [ overloaded || --abort*2 ] (pid & password match) : chd:" << ecf::Child::to_string(child_type()) << " : " << path_to_submittable_ << " : already aborted : action(fob)";
             log(Log::WAR, ss.str() );
             theReply = PreAllocatedReply::ok_cmd();
             return false;
@@ -215,17 +227,20 @@ bool TaskCmd::authenticate(AbstractServer* as, STC_Cmd_ptr& theReply) const
 
   		   // 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";
+  		   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_;
+         ss << " : chd:" << ecf::Child::to_string(child_type());
+         ss << " : " << path_to_submittable_ << "(" << NState::toString(submittable_state) << ")";
+         ss << " : " << 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 << ")";
+         if (password_missmatch) ss << " : passwd != [ task:"<< submittable_->jobsPassword()<<" child:" << jobs_password_ << " ]";
+         if (pid_missmatch)      ss << " : pid != [ task:"<< submittable_->process_or_remote_id()<<" child:" << process_or_remote_id_ << " ]";
+         ss << " : action(" << action_taken << ")";
          log(Log::ERR,ss.str());
   			return false;
   		}
@@ -411,15 +426,7 @@ CtsWaitCmd::CtsWaitCmd(const std::string& pathToTask,
  : 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() );
-   }
+   (void)Expression::parse(expression,"CtsWaitCmd:"); // will throw for errors
 }
 
 std::ostream& CtsWaitCmd::print(std::ostream& os) const
@@ -441,39 +448,22 @@ STC_Cmd_ptr CtsWaitCmd::doHandleRequest(AbstractServer* as) const
 
 	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() ) ;
-	}
-
+	// Parse the expression, should not fail since client should have already check expression parses
 	// 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
+	// This can 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() ) ;
-	}
+	std::auto_ptr<AstTop> ast = submittable_->parse_and_check_expressions(expression_,true,"CtsWaitCmd:" ); // will throw for errors
 
 	// Evaluate the expression
 	if ( ast->evaluate() ) {
 
-		submittable_->flag().clear(ecf::Flag::WAIT);
+	   submittable_->flag().clear(ecf::Flag::WAIT);
 
-		// expression evaluates, return OK
-		return PreAllocatedReply::ok_cmd();
+	   // expression evaluates, return OK
+	   return PreAllocatedReply::ok_cmd();
 	}
 
 	submittable_->flag().set(ecf::Flag::WAIT);
diff --git a/Base/src/stc/DefsCache.cpp b/Base/src/stc/DefsCache.cpp
new file mode 100644
index 0000000..b3adc16
--- /dev/null
+++ b/Base/src/stc/DefsCache.cpp
@@ -0,0 +1,107 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #55 $
+//
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive 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 "DefsCache.hpp"
+#include "Defs.hpp"
+#include "Task.hpp"
+#include "Family.hpp"
+#include "Suite.hpp"
+#include "Alias.hpp"
+#include "Ecf.hpp"
+#include "Log.hpp"
+#include "boost_archive.hpp" // collates boost archive includes
+#include "Serialization.hpp"
+
+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 DefsCache::full_server_defs_as_string_ = "";
+unsigned int DefsCache::state_change_no_ = 0;
+unsigned int DefsCache::modify_change_no_= 0;
+
+void DefsCache::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
+         ecf::save_as_string(full_server_defs_as_string_,defs);
+      }
+      catch (const boost::archive::archive_exception& ae ) {
+         // Unable to decode data. Something went wrong, inform the caller.
+         ecf::LogToCout logToCout;
+         LOG(ecf::Log::ERR,"DefsCache::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 DefsCache::restore_defs_from_string(const std::string& archive_data)
+{
+#ifdef DEBUG_CLIENT_SYNC
+   cout << ": DefsCache::restore_defs_from_string: archive_data.size(" << archive_data.size() << ")";
+#endif
+   defs_ptr defs;
+   try {
+
+      ecf::restore_from_string(archive_data,defs);
+
+   } catch (const boost::archive::archive_exception& ae ) {
+      // Unable to decode data.
+      ecf::LogToCout logToCout;
+      LOG(ecf::Log::ERR,"DefsCache::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,"DefsCache::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 DefsCache::restore_defs_from_string()
+{
+   // Used in Test when no client/server
+   return restore_defs_from_string(full_server_defs_as_string_);
+}
+
diff --git a/Base/src/stc/DefsCache.hpp b/Base/src/stc/DefsCache.hpp
new file mode 100644
index 0000000..05ad4b8
--- /dev/null
+++ b/Base/src/stc/DefsCache.hpp
@@ -0,0 +1,67 @@
+#ifndef DEFS_CACHE_HPP_
+#define DEFS_CACHE_HPP_
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #25 $
+//
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive 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"
+
+//================================================================================
+// 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 DefsCache : 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;
+
+   DefsCache();
+   ~DefsCache();
+   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
+};
+
+#endif
diff --git a/Base/src/stc/ErrorCmd.hpp b/Base/src/stc/ErrorCmd.hpp
index 8e36c76..3bab6f0 100644
--- a/Base/src/stc/ErrorCmd.hpp
+++ b/Base/src/stc/ErrorCmd.hpp
@@ -26,8 +26,9 @@ public:
 	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
+ 	virtual std::string error() const { return error_msg_;}   /// Used by test
+	virtual bool ok() const { return false; }                 /// Used by group command
+   virtual void cleanup() { std::string().swap(error_msg_);} /// run in the server, after command send to client
 
 private:
  	std::string error_msg_;
diff --git a/Base/src/stc/GroupSTCCmd.cpp b/Base/src/stc/GroupSTCCmd.cpp
index 0c1a05c..415e036 100644
--- a/Base/src/stc/GroupSTCCmd.cpp
+++ b/Base/src/stc/GroupSTCCmd.cpp
@@ -80,7 +80,7 @@ bool GroupSTCCmd::handle_server_response( ServerReply& server_reply, Cmd_ptr cts
 		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);
+			PrintStyle print_style(style);
 			if (defs.get()) {
 
 		      /// Auto generate externs, before writing to standard out. This can be expensive since
diff --git a/Base/src/stc/SStringCmd.hpp b/Base/src/stc/SStringCmd.hpp
index 5d1b20c..ed01af2 100644
--- a/Base/src/stc/SStringCmd.hpp
+++ b/Base/src/stc/SStringCmd.hpp
@@ -37,6 +37,7 @@ public:
    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;
+   virtual void cleanup() { std::string().swap(str_);} /// run in the server, after command send to client
 
 private:
    std::string str_;
diff --git a/Base/src/stc/SStringVecCmd.hpp b/Base/src/stc/SStringVecCmd.hpp
index d989067..049ed81 100644
--- a/Base/src/stc/SStringVecCmd.hpp
+++ b/Base/src/stc/SStringVecCmd.hpp
@@ -29,6 +29,7 @@ public:
    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;
+   virtual void cleanup() { std::vector<std::string>().swap(vec_);} /// run in the server, after command send to client
 
 private:
    std::vector<std::string> vec_;
diff --git a/Base/src/stc/SSuitesCmd.hpp b/Base/src/stc/SSuitesCmd.hpp
index 7bfb2b7..6cae0a6 100644
--- a/Base/src/stc/SSuitesCmd.hpp
+++ b/Base/src/stc/SSuitesCmd.hpp
@@ -31,6 +31,7 @@ public:
    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;
+   virtual void cleanup() { std::vector<std::string>().swap(suites_);} /// run in the server, after command send to client
 
 private:
    std::vector<std::string> suites_;
diff --git a/Base/src/stc/SSyncCmd.cpp b/Base/src/stc/SSyncCmd.cpp
index 56bd4da..b1624c7 100644
--- a/Base/src/stc/SSyncCmd.cpp
+++ b/Base/src/stc/SSyncCmd.cpp
@@ -26,83 +26,8 @@ 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
-         ecf::save_as_string(full_server_defs_as_string_,defs);
-      }
-      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 {
-
-      ecf::restore_from_string(archive_data,defs);
-
-   } 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_);
-}
-
+//#define DEBUG_SERVER_SYNC 1  # Also update DefsCache::DEBUG_SERVER_SYNC
+//#define DEBUG_CLIENT_SYNC 1  # Also update DefsCache::DEBUG_CLIENT_SYNC
 
 SSyncCmd::SSyncCmd(
          unsigned int client_handle,
@@ -143,17 +68,6 @@ void SSyncCmd::init(
    // 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(GUI) 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
@@ -271,10 +185,10 @@ void SSyncCmd::full_sync(unsigned int client_handle, AbstractServer* as)
       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());
+      DefsCache::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;
+      cout << ": *no handle* returning FULL defs(*cached* string, size(" << DefsCache::full_server_defs_as_string_.size() << "))" << endl;
 #endif
       return;
    }
@@ -302,10 +216,10 @@ void SSyncCmd::full_sync(unsigned int client_handle, AbstractServer* as)
    // **** 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());
+      DefsCache::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() << "))";
+      cout << ": The handle has *ALL* the suites: return the FULL defs(*cached* string, size(" << DefsCache::full_server_defs_as_string_.size() << "))";
 #endif
    }
    else {
@@ -377,13 +291,13 @@ bool SSyncCmd::do_sync( ServerReply& server_reply, bool debug) const
 #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();
+         server_reply.client_defs_ = DefsCache::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.client_defs_ = DefsCache::restore_defs_from_string(full_server_defs_as_string_);
       }
       server_reply.set_sync( true );
       server_reply.set_full_sync( true );
diff --git a/Base/src/stc/SSyncCmd.hpp b/Base/src/stc/SSyncCmd.hpp
index 0e7bb62..6c8ef0d 100644
--- a/Base/src/stc/SSyncCmd.hpp
+++ b/Base/src/stc/SSyncCmd.hpp
@@ -18,53 +18,7 @@
 
 #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
-};
+#include "DefsCache.hpp"
 
 //================================================================================
 // class SSyncCmd: Used to transfer changes made in the server to the client
@@ -78,7 +32,7 @@ private:
 // 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.
+// This class make use of DefsCache as a performance optimisation.
 //================================================================================
 class SSyncCmd : public ServerToClientCmd {
 public:
@@ -145,7 +99,7 @@ private:
       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_;
+            ar & DefsCache::full_server_defs_as_string_;
          }
          else ar & full_server_defs_as_string_;
       }
diff --git a/Base/src/stc/ServerToClientCmd.hpp b/Base/src/stc/ServerToClientCmd.hpp
index 0c1badc..431b6ff 100644
--- a/Base/src/stc/ServerToClientCmd.hpp
+++ b/Base/src/stc/ServerToClientCmd.hpp
@@ -35,6 +35,8 @@ class ServerToClientCmd {
 public:
 	virtual ~ServerToClientCmd();
 
+	virtual void cleanup() {}    /// After the command has run this function can be used to reclaim memory
+
 	virtual std::ostream& print(std::ostream& os) const = 0;
 	virtual bool equals(ServerToClientCmd*) const { return true;}
 
diff --git a/Base/src/stc/ZombieGetCmd.hpp b/Base/src/stc/ZombieGetCmd.hpp
index 427ebbf..4c429b7 100644
--- a/Base/src/stc/ZombieGetCmd.hpp
+++ b/Base/src/stc/ZombieGetCmd.hpp
@@ -32,6 +32,7 @@ public:
   	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 void cleanup() { std::vector<Zombie>().swap(zombies_);} /// run in the server, after command send to client
 
 private:
 	std::vector<Zombie> zombies_;
diff --git a/Base/test/TestAlterCmd.cpp b/Base/test/TestAlterCmd.cpp
index d350c83..e30c5e4 100644
--- a/Base/test/TestAlterCmd.cpp
+++ b/Base/test/TestAlterCmd.cpp
@@ -16,11 +16,14 @@
 
 #include "ClientToServerCmd.hpp"
 #include "ServerToClientCmd.hpp"
-#include "MyDefsFixture.hpp"
 #include "TestHelper.hpp"
 #include "Str.hpp"
 #include "System.hpp"
 #include "Ecf.hpp"
+#include "Task.hpp"
+#include "Family.hpp"
+#include "Suite.hpp"
+#include "Defs.hpp"
 
 using namespace std;
 using namespace ecf;
@@ -604,16 +607,25 @@ BOOST_AUTO_TEST_CASE( test_alter_cmd )
       BOOST_CHECK_MESSAGE( lm.get() && lm->paths().empty(), "Expected no paths but found " << lm->paths().size());
    }
 
-   {   // test add inlimit
+   {   // test add in-limit
        TestStateChanged changed(s);
        TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"limit_name")));
        TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"limit_name1","11")));
        TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/to/limit:limit_name2")));
        TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/to/limit:limit_name3","10")));
-       BOOST_CHECK_MESSAGE( s->inlimits().size() == 4, "expected 4  but found " <<  s->inlimits().size());
+       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/to/limit:limitA","10")));
+       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/to/limit/a:limitA","10")));
+       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/to/limit/aa:limitA","10")));
+       BOOST_CHECK_MESSAGE( s->inlimits().size() == 7, "expected 7  but found " <<  s->inlimits().size());
 
-       // test delete limit
+       // test delete in-limit
        TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT,"limit_name")));
+       BOOST_CHECK_MESSAGE( s->inlimits().size() == 6, "expected 6 but found " <<  s->inlimits().size());
+       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT,"/path/to/limit:limitA")));
+       BOOST_CHECK_MESSAGE( s->inlimits().size() == 5, "expected 5 but found " <<  s->inlimits().size());
+       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT,"/path/to/limit/a:limitA")));
+       BOOST_CHECK_MESSAGE( s->inlimits().size() == 4, "expected 4 but found " <<  s->inlimits().size());
+       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT,"/path/to/limit/aa:limitA")));
        BOOST_CHECK_MESSAGE( s->inlimits().size() == 3, "expected 3 but found " <<  s->inlimits().size());
        TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT)));
        BOOST_CHECK_MESSAGE( s->inlimits().size() == 0, "expected 0  but found " <<  s->inlimits().size());
@@ -864,6 +876,7 @@ BOOST_AUTO_TEST_CASE( test_alter_sort_attributes )
    suite_ptr ss = sorted_defs.add_suite("suite"); add_sorted_attributes(ss.get());
    family_ptr sf1 = ss->add_family("f1");         add_sorted_attributes(sf1.get());
    task_ptr st1 = sf1->add_task("t1");            add_sorted_attributes(st1.get());
+   sorted_defs.sort_attributes(ecf::Attr::VARIABLE,false/*recursive*/); // just sort the server variables
 
    {
       TestDefsStateChanged chenged(&defs);
@@ -873,9 +886,8 @@ BOOST_AUTO_TEST_CASE( test_alter_sort_attributes )
       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/","label","recursive")));
       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/","limit","recursive")));
       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd("/","variable","recursive")));
-      Ecf::set_debug_equality(true);
+      DebugEquality debug_equality; // only as affect in DEBUG build
       BOOST_CHECK_MESSAGE(defs == sorted_defs,"Sort failed expected\n" << sorted_defs << "\nbut found\n" << defs);
-      Ecf::set_debug_equality(false);
     }
 }
 
@@ -900,9 +912,8 @@ BOOST_AUTO_TEST_CASE( test_alter_sort_attributes_for_task )
       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(t1->absNodePath(),"label","recursive")));
       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(t1->absNodePath(),"limit","recursive")));
       TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(t1->absNodePath(),"variable","recursive")));
-      Ecf::set_debug_equality(true);
+      DebugEquality debug_equality; // only as affect in DEBUG build
       BOOST_CHECK_MESSAGE(defs == sorted_defs,"Sort failed expected\n" << sorted_defs << "\nbut found\n" << defs);
-      Ecf::set_debug_equality(false);
     }
 }
 
@@ -937,6 +948,11 @@ BOOST_AUTO_TEST_CASE( test_alter_cmd_errors )
       TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"")));           // no inlimit value
       TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/limit")));     // limit path, but no name
       TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/tolimit:limit","xx"))); // tokens must be convertible to an integer
+
+      TestHelper::invokeRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::ADD_INLIMIT,"/path/tolimit:limit","1")));
+      TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT,"/path/tolimit")));       // no limit name
+      TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT,"/path/tolimit:")));      // no limit name
+      TestHelper::invokeFailureRequest(&defs,Cmd_ptr( new AlterCmd(s->absNodePath(),AlterCmd::DEL_INLIMIT,"/path/tolimit:12 34"))); // invalid limit name
    }
 
    /// Destroy singleton's to avoid valgrind from complaining
diff --git a/Base/test/TestDeleteNodeCmd.cpp b/Base/test/TestDeleteNodeCmd.cpp
index dc79f64..1958d5f 100644
--- a/Base/test/TestDeleteNodeCmd.cpp
+++ b/Base/test/TestDeleteNodeCmd.cpp
@@ -20,7 +20,6 @@
 #include "ServerToClientCmd.hpp"
 #include "MyDefsFixture.hpp"
 #include "TestHelper.hpp"
-#include "DefsStructureParser.hpp"
 #include "DurationTimer.hpp"
 #include "Str.hpp"
 
@@ -174,9 +173,8 @@ BOOST_AUTO_TEST_CASE( test_delete_node_cmd )
 //      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");
+//         BOOST_REQUIRE_MESSAGE(defs.restore(path_to_very_large_defs_file,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");
diff --git a/Base/test/TestECFLOW-189.cpp b/Base/test/TestECFLOW-189.cpp
index 496c28a..1c094be 100644
--- a/Base/test/TestECFLOW-189.cpp
+++ b/Base/test/TestECFLOW-189.cpp
@@ -16,12 +16,12 @@
 
 #include "ClientToServerCmd.hpp"
 #include "ServerToClientCmd.hpp"
-#include "MyDefsFixture.hpp"
 #include "MockServer.hpp"
 #include "TestHelper.hpp"
 #include "System.hpp"
 #include "PrintStyle.hpp"
 #include "Defs.hpp"
+#include "Family.hpp"
 
 using namespace std;
 using namespace ecf;
diff --git a/Base/test/TestForceCmd.cpp b/Base/test/TestForceCmd.cpp
index f58dd7b..213ae51 100644
--- a/Base/test/TestForceCmd.cpp
+++ b/Base/test/TestForceCmd.cpp
@@ -398,8 +398,7 @@ BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot )
    /// 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";
+//   PrintStyle style(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();
@@ -463,8 +462,7 @@ BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_1 )
    /// 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";
+   //   PrintStyle style(PrintStyle::STATE); cout << the_defs << "\n";
 
    // get all the time attributes
    const TimeSeries& ts_10 = t1->timeVec()[0].time_series();
@@ -563,8 +561,7 @@ BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_2 )
    /// 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";
+   //      PrintStyle style(PrintStyle::MIGRATE); std::cout << defs;
 
    // 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();
@@ -643,8 +640,7 @@ BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_3 )
    /// 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";
+//   PrintStyle style(PrintStyle::STATE); cout << the_defs << "\n";
 
    // get all the time attributes
    const TimeSeries& ts_10 = t1->timeVec()[0].time_series();
@@ -734,8 +730,7 @@ BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_4 )
    /// 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";
+//   PrintStyle style(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();
@@ -806,8 +801,7 @@ BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_for_cron )
    /// 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";
+//   PrintStyle style(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();
@@ -891,8 +885,7 @@ BOOST_AUTO_TEST_CASE( test_force_interactive_next_time_slot_for_cron_on_family )
    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";
+//   PrintStyle style(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();
diff --git a/Base/test/TestJobGenPerf.cpp b/Base/test/TestJobGenPerf.cpp
index 32b0ead..7643c5f 100644
--- a/Base/test/TestJobGenPerf.cpp
+++ b/Base/test/TestJobGenPerf.cpp
@@ -24,7 +24,6 @@
 #include "Log.hpp"
 #include "Jobs.hpp"
 #include "JobsParam.hpp"
-#include "DefsStructureParser.hpp"
 #include "JobProfiler.hpp"
 
 using namespace std;
@@ -60,7 +59,7 @@ int main(int argc, char* argv[])
    }
 
    // delete the log file if it exists.
-   std::string log_path = File::test_data("Base/test/TestJobGenPerf.log","AParser");
+   std::string log_path = File::test_data("Base/test/TestJobGenPerf.log","Base");
    fs::remove(log_path);
    std::string path = argv[1];
 
@@ -68,9 +67,8 @@ int main(int argc, char* argv[])
    cout << "Loading file " << path << " log file " << log_path  << "\n";
 #endif
    Defs defs;
-   DefsStructureParser checkPtParser( &defs, path);
    std::string errorMsg,warningMsg;
-   if (!checkPtParser.doParse(errorMsg,warningMsg)) {
+   if (!defs.restore(path,errorMsg,warningMsg)) {
       cout << errorMsg << "\n";
       cout << warningMsg << "\n";
       return 1;
diff --git a/Base/test/TestJobGenPerf.log b/Base/test/TestJobGenPerf.log
deleted file mode 100644
index 81dd049..0000000
--- a/Base/test/TestJobGenPerf.log
+++ /dev/null
@@ -1,7435 +0,0 @@
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/regenerate job_size:15769
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support
-LOG:[12:55:57 13.4.2017]  submitted: /
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/var_summary job_size:16065
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/git_srcs job_size:16303
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/make_build_dir job_size:14620
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/config job_size:16453
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/build job_size:14706
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/test job_size:15536
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/add_write_perm job_size:15260
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/install job_size:15606
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/install_log job_size:18867
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/remove_write_perm job_size:15300
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/module_sync job_size:14247
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxop_dev/gnu.53/wipe_build job_size:15853
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/var_summary job_size:36799
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/git_srcs job_size:37014
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/make_build_dir job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/config job_size:37021
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/build job_size:35317
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/test job_size:36125
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/add_write_perm job_size:36081
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/install job_size:36275
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/install_log job_size:39735
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/remove_write_perm job_size:36187
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/module_sync job_size:34987
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.49/wipe_build job_size:36579
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/var_summary job_size:36799
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/git_srcs job_size:37014
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/make_build_dir job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/config job_size:37021
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/build job_size:35317
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/test job_size:36125
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/add_write_perm job_size:36081
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/install job_size:36275
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/install_log job_size:39735
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/remove_write_perm job_size:36187
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/module_sync job_size:34987
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/gnu.53/wipe_build job_size:36579
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/var_summary job_size:36870
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/git_srcs job_size:37115
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/make_build_dir job_size:35512
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/config job_size:37098
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/build job_size:35384
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/test job_size:36192
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/add_write_perm job_size:36148
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/install job_size:36344
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/install_log job_size:39808
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/remove_write_perm job_size:36254
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/module_sync job_size:35052
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/intel.16/wipe_build job_size:36650
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/var_summary job_size:36779
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/git_srcs job_size:37024
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/make_build_dir job_size:35421
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/config job_size:37006
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/build job_size:35293
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/test job_size:36101
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/add_write_perm job_size:36057
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/install job_size:36253
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/install_log job_size:39717
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/remove_write_perm job_size:36163
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/module_sync job_size:34961
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.846/wipe_build job_size:36559
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/var_summary job_size:36748
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/git_srcs job_size:36978
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/make_build_dir job_size:35388
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/config job_size:36973
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/build job_size:35264
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/test job_size:36072
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/add_write_perm job_size:36028
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/install job_size:36223
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/install_log job_size:39685
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/remove_write_perm job_size:36134
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/module_sync job_size:34933
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cct/cray.85/wipe_build job_size:36528
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/var_summary job_size:15954
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/git_srcs job_size:15964
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/make_build_dir job_size:14463
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/config job_size:16234
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/build job_size:14605
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/test job_size:15435
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/add_write_perm job_size:15199
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/install job_size:15531
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/install_log job_size:19182
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/remove_write_perm job_size:15239
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/module_sync job_size:14159
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/lxc/gnu/wipe_build job_size:15722
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/var_summary job_size:36799
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/git_srcs job_size:37014
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/make_build_dir job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/config job_size:37021
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/build job_size:35317
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/test job_size:36125
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/add_write_perm job_size:36081
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/install job_size:36275
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/install_log job_size:39735
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/remove_write_perm job_size:36187
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/module_sync job_size:34987
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.49/wipe_build job_size:36579
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/var_summary job_size:36799
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/git_srcs job_size:37014
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/make_build_dir job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/config job_size:37021
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/build job_size:35317
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/test job_size:36125
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/add_write_perm job_size:36081
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/install job_size:36275
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/install_log job_size:39735
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/remove_write_perm job_size:36187
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/module_sync job_size:34987
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/gnu.53/wipe_build job_size:36579
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/var_summary job_size:36846
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/git_srcs job_size:37091
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/make_build_dir job_size:35488
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/config job_size:37074
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/build job_size:35360
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/test job_size:36168
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/add_write_perm job_size:36124
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/install job_size:36320
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/install_log job_size:39784
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/remove_write_perm job_size:36230
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/module_sync job_size:35028
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/intel.16/wipe_build job_size:36626
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/var_summary job_size:36779
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/git_srcs job_size:37024
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/make_build_dir job_size:35421
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/config job_size:37006
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/build job_size:35293
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/test job_size:36101
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/add_write_perm job_size:36057
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/install job_size:36253
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/install_log job_size:39717
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/remove_write_perm job_size:36163
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/module_sync job_size:34961
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.846/wipe_build job_size:36559
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/var_summary job_size:36748
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/git_srcs job_size:36978
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/make_build_dir job_size:35388
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/config job_size:36973
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/build job_size:35264
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/test job_size:36072
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/add_write_perm job_size:36028
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/install job_size:36223
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/install_log job_size:39685
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/remove_write_perm job_size:36134
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/module_sync job_size:34933
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/cca/cray.85/wipe_build job_size:36528
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/var_summary job_size:36799
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/git_srcs job_size:37014
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/make_build_dir job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/config job_size:37021
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/build job_size:35317
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/test job_size:36125
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/add_write_perm job_size:36081
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/install job_size:36275
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/install_log job_size:39735
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/remove_write_perm job_size:36187
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/module_sync job_size:34987
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.49/wipe_build job_size:36579
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/var_summary job_size:36799
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/git_srcs job_size:37014
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/make_build_dir job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/config job_size:37021
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/build job_size:35317
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/test job_size:36125
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/add_write_perm job_size:36081
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/install job_size:36275
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/install_log job_size:39735
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/remove_write_perm job_size:36187
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/module_sync job_size:34987
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/gnu.53/wipe_build job_size:36579
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/var_summary job_size:36846
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/git_srcs job_size:37091
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/make_build_dir job_size:35488
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/config job_size:37074
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/build job_size:35360
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/test job_size:36168
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/add_write_perm job_size:36124
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/install job_size:36320
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/install_log job_size:39784
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/remove_write_perm job_size:36230
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/module_sync job_size:35028
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/intel.16/wipe_build job_size:36626
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/var_summary job_size:36779
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/git_srcs job_size:37024
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/make_build_dir job_size:35421
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/config job_size:37006
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/build job_size:35293
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/test job_size:36101
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/add_write_perm job_size:36057
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/install job_size:36253
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/install_log job_size:39717
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/remove_write_perm job_size:36163
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/module_sync job_size:34961
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.846/wipe_build job_size:36559
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/var_summary job_size:36748
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/git_srcs job_size:36978
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/make_build_dir job_size:35388
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/config job_size:36973
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/build job_size:35264
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/test job_size:36072
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/add_write_perm job_size:36028
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/install job_size:36223
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/install_log job_size:39685
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/remove_write_perm job_size:36134
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/module_sync job_size:34933
-LOG:[12:55:57 13.4.2017]  submitted: /ifs_support/ccb/cray.85/wipe_build job_size:36528
-WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/regenerate job_size:15448
-LOG:[12:55:57 13.4.2017]  submitted: /Magics
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/var_summary job_size:15733
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/git_srcs job_size:15643
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/make_build_dir job_size:14284
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/config job_size:15276
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/build job_size:14414
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/test job_size:15244
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/add_write_perm job_size:14937
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/install job_size:15054
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/install_link job_size:14831
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/install_log job_size:18438
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/remove_write_perm job_size:14976
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/module_sync job_size:13961
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxop_dev/wipe_build job_size:15538
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/var_summary job_size:15664
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/git_srcs job_size:15460
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/make_build_dir job_size:14192
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/config job_size:15189
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/build job_size:14350
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/test job_size:15180
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/add_write_perm job_size:14873
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/install job_size:14983
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/install_link job_size:14767
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/install_log job_size:18362
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/remove_write_perm job_size:14912
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/module_sync job_size:13904
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/ecgb/wipe_build job_size:15455
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/var_summary job_size:15735
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/git_srcs job_size:15564
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/make_build_dir job_size:14257
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/config job_size:15246
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/build job_size:14403
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/test job_size:15233
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/add_write_perm job_size:14926
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/install job_size:15039
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/install_link job_size:14820
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/install_log job_size:18436
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/remove_write_perm job_size:14965
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/module_sync job_size:13961
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/opensuse131/wipe_build job_size:15518
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/var_summary job_size:15650
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/git_srcs job_size:15377
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/make_build_dir job_size:14161
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/config job_size:15165
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/build job_size:14335
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/test job_size:15165
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/add_write_perm job_size:14858
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/install job_size:14964
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/install_link job_size:14752
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/install_log job_size:18344
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/remove_write_perm job_size:14897
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/module_sync job_size:13892
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/lxc/wipe_build job_size:15435
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/var_summary job_size:15680
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/git_srcs job_size:15434
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/make_build_dir job_size:14192
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/config job_size:15191
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/build job_size:14358
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/test job_size:15188
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/add_write_perm job_size:14881
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/install job_size:14989
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/install_link job_size:14775
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/install_log job_size:18376
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/remove_write_perm job_size:14920
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/module_sync job_size:13916
-LOG:[12:55:57 13.4.2017]  submitted: /Magics/leap42/wipe_build job_size:15463
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/regenerate job_size:15573
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/var_summary job_size:15679
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/git_srcs job_size:15763
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/make_build_dir job_size:14225
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/config job_size:15235
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/build job_size:14335
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/install job_size:14981
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/tests/archive job_size:15697
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/tests/bad_archive job_size:16366
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/tests/environment job_size:16301
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/install_log job_size:18415
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/remove_write_perm job_size:14899
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxop_dev/wipe_build job_size:15469
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/var_summary job_size:36142
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/git_srcs job_size:36203
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/make_build_dir job_size:34771
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/config job_size:35583
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/build job_size:34675
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/install job_size:35367
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/tests/archive job_size:36185
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/tests/bad_archive job_size:36942
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/tests/environment job_size:36877
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/install_log job_size:38880
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/remove_write_perm job_size:35503
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cck/wipe_build job_size:35924
-WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/var_summary job_size:36220
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/git_srcs job_size:36281
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/make_build_dir job_size:34849
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/config job_size:35676
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/build job_size:34753
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/install job_size:35445
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/tests/archive job_size:36263
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/tests/bad_archive job_size:37020
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/tests/environment job_size:36955
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/install_log job_size:38958
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/remove_write_perm job_size:35581
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cct/wipe_build job_size:36002
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/var_summary job_size:15618
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/git_srcs job_size:15588
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/make_build_dir job_size:14141
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/config job_size:15063
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/build job_size:14279
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/install job_size:14918
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/tests/archive job_size:15641
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/tests/bad_archive job_size:16310
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/tests/environment job_size:16245
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/install_log job_size:18347
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/remove_write_perm job_size:14843
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ecgb/wipe_build job_size:15394
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/var_summary job_size:15577
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/git_srcs job_size:15478
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/make_build_dir job_size:14083
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/config job_size:15009
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/build job_size:14237
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/install job_size:14872
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/tests/archive job_size:15599
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/tests/bad_archive job_size:16268
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/tests/environment job_size:16203
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/install_log job_size:18302
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/remove_write_perm job_size:14801
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxg/wipe_build job_size:15347
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/var_summary job_size:15663
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/git_srcs job_size:15666
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/make_build_dir job_size:14180
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/config job_size:15099
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/build job_size:14306
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/install job_size:14948
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/tests/archive job_size:15668
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/tests/bad_archive job_size:16337
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/tests/environment job_size:16272
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/install_log job_size:18395
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/remove_write_perm job_size:14870
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/opensuse131/wipe_build job_size:15431
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/var_summary job_size:15598
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/git_srcs job_size:15499
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/make_build_dir job_size:14104
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/config job_size:15100
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/build job_size:14258
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/install job_size:14893
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/tests/archive job_size:15620
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/tests/bad_archive job_size:16289
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/tests/environment job_size:16224
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/install_log job_size:18323
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/remove_write_perm job_size:14822
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/lxc/wipe_build job_size:15368
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/var_summary job_size:15608
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/git_srcs job_size:15536
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/make_build_dir job_size:14115
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/config job_size:15039
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/build job_size:14261
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/install job_size:14898
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/tests/archive job_size:15623
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/tests/bad_archive job_size:16292
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/tests/environment job_size:16227
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/install_log job_size:18335
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/remove_write_perm job_size:14825
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/leap42/wipe_build job_size:15376
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/var_summary job_size:36220
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/git_srcs job_size:36281
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/make_build_dir job_size:34849
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/config job_size:35676
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/build job_size:34753
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/install job_size:35445
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/tests/archive job_size:36263
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/tests/bad_archive job_size:37020
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/tests/environment job_size:36955
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/install_log job_size:38958
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/remove_write_perm job_size:35581
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/cca/wipe_build job_size:36002
-WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/var_summary job_size:36220
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/git_srcs job_size:36281
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/make_build_dir job_size:34849
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/config job_size:35676
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/build job_size:34753
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/install job_size:35445
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/tests/archive job_size:36263
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/tests
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/tests/bad_archive job_size:37020
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/tests/environment job_size:36955
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/install_log job_size:38958
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/remove_write_perm job_size:35581
-LOG:[12:55:57 13.4.2017]  submitted: /mars_client/ccb/wipe_build job_size:36002
-LOG:[12:55:57 13.4.2017]  submitted: /mir/regenerate job_size:15491
-LOG:[12:55:57 13.4.2017]  submitted: /mir
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.53/var_summary job_size:36075
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.53/git_srcs job_size:36002
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.53/make_build_dir job_size:34721
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.53/config job_size:35521
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.53/build job_size:34633
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.53/test job_size:35441
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.53/test_memcheck job_size:27321
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.53/wipe_build job_size:35871
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.62/var_summary job_size:36075
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.62
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.62/git_srcs job_size:36002
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.62/make_build_dir job_size:34721
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.62/config job_size:35521
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.62/build job_size:34633
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.62/test job_size:35441
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.62/test_memcheck job_size:27321
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/gnu.62/wipe_build job_size:35871
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/intel.17/var_summary job_size:36109
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/intel.17
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/intel.17/git_srcs job_size:36066
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/intel.17/make_build_dir job_size:34759
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/intel.17/config job_size:35557
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/intel.17/build job_size:34663
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/intel.17/test job_size:35471
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/intel.17/test_memcheck job_size:27341
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/intel.17/wipe_build job_size:35905
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/cray.85/var_summary job_size:36042
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/cray.85
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/cray.85/git_srcs job_size:35984
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/cray.85/make_build_dir job_size:34690
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/cray.85/config job_size:35489
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/cray.85/build job_size:34598
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/cray.85/test job_size:35406
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/cray.85/test_memcheck job_size:27281
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cck/cray.85/wipe_build job_size:35838
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.49/var_summary job_size:36071
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.49/git_srcs job_size:35998
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.49/make_build_dir job_size:34717
-WAR:[12:55:57 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.49/config job_size:35517
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.49/build job_size:34629
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.49/test job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.49/test_memcheck job_size:27317
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.49/wipe_build job_size:35867
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.53/var_summary job_size:36071
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.53/git_srcs job_size:35998
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.53/make_build_dir job_size:34717
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.53/config job_size:35517
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.53/build job_size:34629
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.53/test job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.53/test_memcheck job_size:27317
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/gnu.53/wipe_build job_size:35867
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/intel.16/var_summary job_size:36136
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/intel.16/git_srcs job_size:36093
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/intel.16/make_build_dir job_size:34786
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/intel.16/config job_size:35584
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/intel.16/build job_size:34690
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/intel.16/test job_size:35498
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/intel.16/test_memcheck job_size:27368
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/intel.16/wipe_build job_size:35932
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.84/var_summary job_size:36038
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.84
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.84/git_srcs job_size:35980
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.84/make_build_dir job_size:34686
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.84/config job_size:35485
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.84/build job_size:34594
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.84/test job_size:35402
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.84/test_memcheck job_size:27277
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.84/wipe_build job_size:35834
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.85/var_summary job_size:36038
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.85
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.85/git_srcs job_size:35980
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.85/make_build_dir job_size:34686
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.85/config job_size:35485
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.85/build job_size:34594
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.85/test job_size:35402
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.85/test_memcheck job_size:27277
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.85/wipe_build job_size:35834
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.846/var_summary job_size:36066
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.846
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.846/git_srcs job_size:36023
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.846/make_build_dir job_size:34716
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.846/config job_size:35514
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.846/build job_size:34620
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.846/test job_size:35428
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.846/test_memcheck job_size:27298
-LOG:[12:55:57 13.4.2017]  submitted: /mir/cct/cray.846/wipe_build job_size:35862
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb/gnu.53/var_summary job_size:15605
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb/gnu.53/git_srcs job_size:15441
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb/gnu.53/make_build_dir job_size:14145
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb/gnu.53/config job_size:15083
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb/gnu.53/build job_size:14291
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb/gnu.53/test job_size:15121
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb/gnu.53/test_memcheck job_size:12837
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ecgb/gnu.53/wipe_build job_size:15403
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/gnu.53/var_summary job_size:15630
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/gnu.53/git_srcs job_size:15397
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/gnu.53/make_build_dir job_size:14153
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/gnu.53/config job_size:15165
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/gnu.53/build job_size:14315
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/gnu.53/test job_size:15145
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/gnu.53/test_memcheck job_size:12863
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/gnu.53/wipe_build job_size:15422
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/intel.16/var_summary job_size:15690
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/intel.16/git_srcs job_size:15487
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/intel.16/make_build_dir job_size:14217
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/intel.16/config job_size:15227
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/intel.16/build job_size:14371
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/intel.16/test job_size:15201
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/intel.16/test_memcheck job_size:12915
-LOG:[12:55:57 13.4.2017]  submitted: /mir/lxg/intel.16/wipe_build job_size:15482
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.53/var_summary job_size:15619
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.53/git_srcs job_size:15413
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.53/make_build_dir job_size:14143
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.53/config job_size:15083
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.53/build job_size:14297
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.53/test job_size:15127
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.53/test_memcheck job_size:12839
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.53/wipe_build job_size:15409
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.61/var_summary job_size:15643
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.61
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.61/git_srcs job_size:15437
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.61/make_build_dir job_size:14167
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.61/config job_size:15107
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.61/build job_size:14321
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.61/test job_size:15151
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.61/test_memcheck job_size:12863
-LOG:[12:55:57 13.4.2017]  submitted: /mir/leap42/gnu.61/wipe_build job_size:15433
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.49/var_summary job_size:36071
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.49/git_srcs job_size:35998
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.49/make_build_dir job_size:34717
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.49/config job_size:35517
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.49/build job_size:34629
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.49/test job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.49/test_memcheck job_size:27317
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.49/wipe_build job_size:35867
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.53/var_summary job_size:36071
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.53/git_srcs job_size:35998
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.53/make_build_dir job_size:34717
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.53/config job_size:35517
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.53/build job_size:34629
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.53/test job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.53/test_memcheck job_size:27317
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/gnu.53/wipe_build job_size:35867
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/intel.16/var_summary job_size:36112
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/intel.16/git_srcs job_size:36069
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/intel.16/make_build_dir job_size:34762
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/intel.16/config job_size:35560
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/intel.16/build job_size:34666
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/intel.16/test job_size:35474
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/intel.16/test_memcheck job_size:27344
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/intel.16/wipe_build job_size:35908
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.84/var_summary job_size:36038
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.84
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.84/git_srcs job_size:35980
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.84/make_build_dir job_size:34686
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.84/config job_size:35485
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.84/build job_size:34594
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.84/test job_size:35402
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.84/test_memcheck job_size:27277
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.84/wipe_build job_size:35834
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.846/var_summary job_size:36066
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.846
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.846/git_srcs job_size:36023
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.846/make_build_dir job_size:34716
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.846/config job_size:35514
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.846/build job_size:34620
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.846/test job_size:35428
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.846/test_memcheck job_size:27298
-LOG:[12:55:57 13.4.2017]  submitted: /mir/ccb/cray.846/wipe_build job_size:35862
-WAR:[12:55:57 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/regenerate job_size:15440
-LOG:[12:55:57 13.4.2017]  submitted: /pgen
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/var_summary job_size:36036
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/git_srcs job_size:35991
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/make_build_dir job_size:34681
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/config job_size:35471
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/build job_size:34589
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/install job_size:35282
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/install_log job_size:38861
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/remove_write_perm job_size:35417
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/module_sync job_size:34259
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cca/gnu.49/wipe_build job_size:35830
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/var_summary job_size:36036
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/git_srcs job_size:35991
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/make_build_dir job_size:34681
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/config job_size:35471
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/build job_size:34589
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/install job_size:35282
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/install_log job_size:38861
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/remove_write_perm job_size:35417
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/module_sync job_size:34259
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/ccb/gnu.49/wipe_build job_size:35830
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/var_summary job_size:36036
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/git_srcs job_size:35991
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/make_build_dir job_size:34681
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/config job_size:35471
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/build job_size:34589
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/install job_size:35282
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/install_log job_size:38861
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/remove_write_perm job_size:35417
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/module_sync job_size:34259
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cct/gnu.49/wipe_build job_size:35830
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/var_summary job_size:35911
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/git_srcs job_size:35866
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/make_build_dir job_size:34556
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/config job_size:35346
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/build job_size:34464
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/install job_size:35157
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/install_log job_size:38736
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/remove_write_perm job_size:35292
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/module_sync job_size:34134
-LOG:[12:55:57 13.4.2017]  submitted: /pgen/cck/gnu.49/wipe_build job_size:35705
-WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/regenerate job_size:15353
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/var_summary job_size:36201
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/git_srcs job_size:36219
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/make_build_dir job_size:34843
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/config job_size:35618
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/build job_size:34739
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/test job_size:35525
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/install job_size:35437
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/install_log job_size:39008
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/remove_write_perm job_size:35569
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/module_sync job_size:34409
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cck/gnu.53/wipe_build job_size:35989
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/var_summary job_size:36196
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/git_srcs job_size:36214
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/make_build_dir job_size:34838
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/config job_size:35613
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/build job_size:34734
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/test job_size:35520
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/install job_size:35432
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/install_log job_size:39003
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/remove_write_perm job_size:35564
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/module_sync job_size:34404
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/gnu.49/wipe_build job_size:35984
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/var_summary job_size:36163
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/git_srcs job_size:36196
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/make_build_dir job_size:34807
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/config job_size:35822
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/build job_size:34699
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/test job_size:35485
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/install job_size:35398
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/install_log job_size:38971
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/remove_write_perm job_size:35529
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/module_sync job_size:34368
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.84/wipe_build job_size:35951
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/var_summary job_size:36191
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/git_srcs job_size:36239
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/make_build_dir job_size:34837
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/config job_size:35850
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/build job_size:34725
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/test job_size:35511
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/install job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/install_log job_size:39000
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/remove_write_perm job_size:35555
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/module_sync job_size:34393
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cct/cray.841/wipe_build job_size:35979
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/var_summary job_size:15524
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/git_srcs job_size:15484
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/make_build_dir job_size:14054
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/config job_size:15013
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/build job_size:14172
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/test job_size:14980
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/install job_size:14820
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/install_log job_size:18325
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/remove_write_perm job_size:14738
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/module_sync job_size:13724
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/opensuse131/gnu.48/wipe_build job_size:15302
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/var_summary job_size:15496
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/git_srcs job_size:15381
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/make_build_dir job_size:14016
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/config job_size:14985
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/build job_size:14154
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/test job_size:14962
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/install job_size:14797
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/install_log job_size:18292
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/remove_write_perm job_size:14720
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/module_sync job_size:13706
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/leap42/gnu.53/wipe_build job_size:15274
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/var_summary job_size:36196
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/git_srcs job_size:36214
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/make_build_dir job_size:34838
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/config job_size:35823
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/build job_size:34734
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/test job_size:35520
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/install job_size:35432
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/install_log job_size:39003
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/remove_write_perm job_size:35564
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/module_sync job_size:34404
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/gnu.49/wipe_build job_size:35984
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/var_summary job_size:36163
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/git_srcs job_size:36196
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/make_build_dir job_size:34807
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/config job_size:35822
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/build job_size:34699
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/test job_size:35485
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/install job_size:35398
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/install_log job_size:38971
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/remove_write_perm job_size:35529
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/module_sync job_size:34368
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.84/wipe_build job_size:35951
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/var_summary job_size:36191
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/git_srcs job_size:36239
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/make_build_dir job_size:34837
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/config job_size:35850
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/build job_size:34725
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/test job_size:35511
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/install job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/install_log job_size:39000
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/remove_write_perm job_size:35555
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/module_sync job_size:34393
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/cca/cray.841/wipe_build job_size:35979
-WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/var_summary job_size:36196
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/git_srcs job_size:36214
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/make_build_dir job_size:34838
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/config job_size:35613
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/build job_size:34734
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/test job_size:35520
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/install job_size:35432
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/install_log job_size:39003
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/remove_write_perm job_size:35564
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/module_sync job_size:34404
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/gnu.49/wipe_build job_size:35984
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/var_summary job_size:36163
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/git_srcs job_size:36196
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/make_build_dir job_size:34807
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/config job_size:35822
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/build job_size:34699
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/test job_size:35485
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/install job_size:35398
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/install_log job_size:38971
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/remove_write_perm job_size:35529
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/module_sync job_size:34368
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.84/wipe_build job_size:35951
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/var_summary job_size:36191
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/git_srcs job_size:36239
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/make_build_dir job_size:34837
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/config job_size:35850
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/build job_size:34725
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/test job_size:35511
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/install job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/install_log job_size:39000
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/remove_write_perm job_size:35555
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/module_sync job_size:34393
-LOG:[12:55:57 13.4.2017]  submitted: /prodgen/ccb/cray.841/wipe_build job_size:35979
-LOG:[12:55:57 13.4.2017]  submitted: /metview/regenerate job_size:15353
-LOG:[12:55:57 13.4.2017]  submitted: /metview
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/var_summary job_size:15690
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/git_srcs job_size:15547
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/git_update_repos job_size:17625
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/make_build_dir job_size:14205
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/config job_size:15952
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/build job_size:14351
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/test job_size:15181
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/set_write_permissions job_size:15321
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/install job_size:15014
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/install_test job_size:14930
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/install_log job_size:18630
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/remove_write_perm job_size:14940
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/module_sync job_size:13905
-LOG:[12:55:57 13.4.2017]  submitted: /metview/localhost/wipe_build job_size:15473
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/regenerate job_size:15334
-LOG:[12:55:57 13.4.2017]  submitted: /metkit
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/var_summary job_size:15492
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/git_srcs job_size:15488
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/make_build_dir job_size:14052
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/config job_size:14917
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/build job_size:14158
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/test job_size:14988
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/add_write_perm job_size:14715
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/install job_size:14839
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/install_log job_size:18647
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/remove_write_perm job_size:14754
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.49/wipe_build job_size:15295
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/var_summary job_size:15516
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/git_srcs job_size:15512
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/make_build_dir job_size:14076
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/config job_size:14941
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/build job_size:14182
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/test job_size:15012
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/add_write_perm job_size:14739
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/install job_size:14863
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/install_log job_size:18671
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/remove_write_perm job_size:14778
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxop_dev/gnu.53/wipe_build job_size:15319
-WAR:[12:55:57 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/var_summary job_size:36014
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/git_srcs job_size:35987
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/make_build_dir job_size:34657
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/config job_size:35364
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/build job_size:34557
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/test job_size:35365
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/add_write_perm job_size:35284
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/install job_size:35256
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/install_log job_size:38863
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/remove_write_perm job_size:35389
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.53/wipe_build job_size:35804
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/var_summary job_size:36014
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/git_srcs job_size:35987
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/make_build_dir job_size:34657
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/config job_size:35364
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/build job_size:34557
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/test job_size:35365
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/add_write_perm job_size:35284
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/install job_size:35256
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/install_log job_size:38863
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/remove_write_perm job_size:35389
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/gnu.62/wipe_build job_size:35804
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/var_summary job_size:36048
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/git_srcs job_size:36051
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/make_build_dir job_size:34695
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/config job_size:35398
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/build job_size:34587
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/test job_size:35395
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/add_write_perm job_size:35314
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/install job_size:35288
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/install_log job_size:38899
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/remove_write_perm job_size:35419
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/intel.17/wipe_build job_size:35838
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/var_summary job_size:35981
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/git_srcs job_size:35969
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/make_build_dir job_size:34626
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/config job_size:35331
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/build job_size:34522
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/test job_size:35330
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/add_write_perm job_size:35249
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/install job_size:35222
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/install_log job_size:38831
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/remove_write_perm job_size:35354
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cck/cray.85/wipe_build job_size:35771
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/var_summary job_size:36010
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/git_srcs job_size:35983
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/make_build_dir job_size:34653
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/config job_size:35360
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/build job_size:34553
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/test job_size:35361
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/add_write_perm job_size:35280
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/install job_size:35252
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/install_log job_size:38859
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/remove_write_perm job_size:35385
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.49/wipe_build job_size:35800
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/var_summary job_size:36010
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/git_srcs job_size:35983
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/make_build_dir job_size:34653
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/config job_size:35360
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/build job_size:34553
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/test job_size:35361
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/add_write_perm job_size:35280
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/install job_size:35252
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/install_log job_size:38859
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/remove_write_perm job_size:35385
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/gnu.53/wipe_build job_size:35800
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/var_summary job_size:36075
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/make_build_dir job_size:34722
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/config job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/build job_size:34614
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/test job_size:35422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/add_write_perm job_size:35341
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/install_log job_size:38926
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/remove_write_perm job_size:35446
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.14/wipe_build job_size:35865
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/var_summary job_size:36075
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/make_build_dir job_size:34722
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/config job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/build job_size:34614
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/test job_size:35422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/add_write_perm job_size:35341
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/install_log job_size:38926
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/remove_write_perm job_size:35446
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.15/wipe_build job_size:35865
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/var_summary job_size:36075
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/make_build_dir job_size:34722
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/config job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/build job_size:34614
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/test job_size:35422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/add_write_perm job_size:35341
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/install_log job_size:38926
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/remove_write_perm job_size:35446
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/intel.16/wipe_build job_size:35865
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/var_summary job_size:35977
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/git_srcs job_size:35965
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/make_build_dir job_size:34622
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/config job_size:35327
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/build job_size:34518
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/test job_size:35326
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/add_write_perm job_size:35245
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/install job_size:35218
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/install_log job_size:38827
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/remove_write_perm job_size:35350
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.84/wipe_build job_size:35767
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/var_summary job_size:35977
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/git_srcs job_size:35965
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/make_build_dir job_size:34622
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/config job_size:35327
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/build job_size:34518
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/test job_size:35326
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/add_write_perm job_size:35245
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/install job_size:35218
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/install_log job_size:38827
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/remove_write_perm job_size:35350
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.85/wipe_build job_size:35767
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/var_summary job_size:36005
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/git_srcs job_size:36008
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/make_build_dir job_size:34652
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/config job_size:35355
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/build job_size:34544
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/test job_size:35352
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/add_write_perm job_size:35271
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/install job_size:35245
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/install_log job_size:38856
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/remove_write_perm job_size:35376
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cct/cray.846/wipe_build job_size:35795
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/var_summary job_size:15389
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/git_srcs job_size:15127
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/make_build_dir job_size:13899
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/config job_size:14730
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/build job_size:14069
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/test job_size:14899
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/add_write_perm job_size:14585
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/install job_size:14693
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/install_log job_size:18077
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/remove_write_perm job_size:14624
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappa/wipe_build job_size:15179
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/var_summary job_size:15451
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/git_srcs job_size:15333
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/make_build_dir job_size:13988
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/config job_size:14842
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/build job_size:14122
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/test job_size:14952
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/add_write_perm job_size:14679
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/install job_size:14796
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/install_log job_size:18599
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/remove_write_perm job_size:14718
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.44/wipe_build job_size:15240
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/var_summary job_size:15427
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/git_srcs job_size:15309
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/make_build_dir job_size:13964
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/config job_size:14818
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/build job_size:14098
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/test job_size:14928
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/add_write_perm job_size:14655
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/install job_size:14772
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/install_log job_size:18575
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/remove_write_perm job_size:14694
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ecgb/gnu.53/wipe_build job_size:15216
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/var_summary job_size:15413
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/git_srcs job_size:15226
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/make_build_dir job_size:13933
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/config job_size:14795
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/build job_size:14083
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/test job_size:14913
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/add_write_perm job_size:14640
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/install job_size:14753
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/install_log job_size:18557
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/remove_write_perm job_size:14679
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/gnu.53/wipe_build job_size:15196
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/var_summary job_size:15473
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/git_srcs job_size:15316
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/make_build_dir job_size:13997
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/config job_size:14855
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/build job_size:14139
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/test job_size:14969
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/add_write_perm job_size:14696
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/install job_size:14811
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/install_log job_size:18619
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/remove_write_perm job_size:14735
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/intel.16/wipe_build job_size:15256
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/var_summary job_size:15451
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/git_srcs job_size:15264
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/make_build_dir job_size:13971
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/config job_size:14833
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/build job_size:14121
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/test job_size:14951
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/add_write_perm job_size:14678
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/install job_size:14791
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/install_log job_size:18595
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/remove_write_perm job_size:14717
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxg/pgi.16/wipe_build job_size:15234
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/var_summary job_size:15518
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/git_srcs job_size:15433
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/make_build_dir job_size:14049
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/config job_size:14897
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/build job_size:14171
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/test job_size:15001
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/add_write_perm job_size:14728
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/install job_size:14848
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/install_log job_size:18669
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/remove_write_perm job_size:14767
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.48/wipe_build job_size:15299
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/var_summary job_size:15542
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/git_srcs job_size:15457
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/make_build_dir job_size:14073
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/config job_size:14921
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/build job_size:14195
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/test job_size:15025
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/add_write_perm job_size:14752
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/install job_size:14872
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/install_log job_size:18693
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/remove_write_perm job_size:14791
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.53/wipe_build job_size:15323
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/var_summary job_size:15542
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/git_srcs job_size:15457
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/make_build_dir job_size:14073
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/config job_size:14921
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/build job_size:14195
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/test job_size:15025
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/add_write_perm job_size:14752
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/install job_size:14872
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/install_log job_size:18693
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/remove_write_perm job_size:14791
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/gnu.61/wipe_build job_size:15323
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/var_summary job_size:15526
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/git_srcs job_size:15396
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/make_build_dir job_size:14051
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/config job_size:14905
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/build job_size:14185
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/test job_size:15015
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/add_write_perm job_size:14742
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/install job_size:14859
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/install_log job_size:18674
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/remove_write_perm job_size:14781
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/opensuse131/pgi/wipe_build job_size:15307
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/var_summary job_size:15414
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/git_srcs job_size:15227
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/make_build_dir job_size:13934
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/config job_size:14796
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/build job_size:14084
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/test job_size:14914
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/add_write_perm job_size:14641
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/install job_size:14754
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/install_log job_size:18558
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/remove_write_perm job_size:14680
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.49/wipe_build job_size:15197
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/var_summary job_size:15438
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/git_srcs job_size:15251
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/make_build_dir job_size:13958
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/config job_size:14820
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/build job_size:14108
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/test job_size:14938
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/add_write_perm job_size:14665
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/install job_size:14778
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/install_log job_size:18582
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/remove_write_perm job_size:14704
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/gnu.53/wipe_build job_size:15221
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/var_summary job_size:15422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/git_srcs job_size:15190
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/make_build_dir job_size:13936
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/config job_size:14804
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/build job_size:14098
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/test job_size:14928
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/add_write_perm job_size:14655
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/install job_size:14765
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/install_log job_size:18563
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/remove_write_perm job_size:14694
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/lxc/pgi/wipe_build job_size:15205
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/var_summary job_size:15468
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/git_srcs job_size:15308
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/make_build_dir job_size:13989
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/config job_size:14847
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/build job_size:14131
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/test job_size:14961
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/add_write_perm job_size:14688
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/install job_size:14803
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/install_log job_size:18614
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/remove_write_perm job_size:14727
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.53/wipe_build job_size:15249
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/var_summary job_size:15492
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/git_srcs job_size:15332
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/make_build_dir job_size:14013
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/config job_size:14871
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/build job_size:14155
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/test job_size:14985
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/add_write_perm job_size:14712
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/install job_size:14827
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/install_log job_size:18638
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/remove_write_perm job_size:14751
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/gnu.61/wipe_build job_size:15273
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/var_summary job_size:15476
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/git_srcs job_size:15271
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/make_build_dir job_size:13991
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/config job_size:14855
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/build job_size:14145
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/test job_size:14975
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/add_write_perm job_size:14702
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/install job_size:14814
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/install_log job_size:18619
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/remove_write_perm job_size:14741
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/leap42/pgi/wipe_build job_size:15257
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/var_summary job_size:15389
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/git_srcs job_size:15127
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/make_build_dir job_size:13899
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/config job_size:14730
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/build job_size:14069
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/test job_size:14899
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/add_write_perm job_size:14585
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/install job_size:14693
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/install_log job_size:18077
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/remove_write_perm job_size:14624
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/sappb/wipe_build job_size:15179
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/var_summary job_size:36010
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/git_srcs job_size:35983
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/make_build_dir job_size:34653
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/config job_size:35360
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/build job_size:34553
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/test job_size:35361
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/add_write_perm job_size:35280
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/install job_size:35252
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/install_log job_size:38859
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/remove_write_perm job_size:35385
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.49/wipe_build job_size:35800
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/var_summary job_size:36010
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/git_srcs job_size:35983
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/make_build_dir job_size:34653
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/config job_size:35360
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/build job_size:34553
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/test job_size:35361
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/add_write_perm job_size:35280
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/install job_size:35252
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/install_log job_size:38859
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/remove_write_perm job_size:35385
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/gnu.53/wipe_build job_size:35800
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/var_summary job_size:36075
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/make_build_dir job_size:34722
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/config job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/build job_size:34614
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/test job_size:35422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/add_write_perm job_size:35341
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/install_log job_size:38926
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/remove_write_perm job_size:35446
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.14/wipe_build job_size:35865
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/var_summary job_size:36075
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/make_build_dir job_size:34722
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/config job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/build job_size:34614
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/test job_size:35422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/add_write_perm job_size:35341
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/install_log job_size:38926
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/remove_write_perm job_size:35446
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.15/wipe_build job_size:35865
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/var_summary job_size:36051
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/git_srcs job_size:36054
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/make_build_dir job_size:34698
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/config job_size:35401
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/build job_size:34590
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/test job_size:35398
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/add_write_perm job_size:35317
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/install job_size:35291
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/install_log job_size:38902
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/remove_write_perm job_size:35422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/intel.16/wipe_build job_size:35841
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/var_summary job_size:35977
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/git_srcs job_size:35965
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/make_build_dir job_size:34622
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/config job_size:35327
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/build job_size:34518
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/test job_size:35326
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/add_write_perm job_size:35245
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/install job_size:35218
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/install_log job_size:38827
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/remove_write_perm job_size:35350
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.84/wipe_build job_size:35767
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/var_summary job_size:36005
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/git_srcs job_size:36008
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/make_build_dir job_size:34652
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/config job_size:35355
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/build job_size:34544
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/test job_size:35352
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/add_write_perm job_size:35271
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/install job_size:35245
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/install_log job_size:38856
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/remove_write_perm job_size:35376
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/cca/cray.846/wipe_build job_size:35795
-WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/var_summary job_size:36010
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/git_srcs job_size:35983
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/make_build_dir job_size:34653
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/config job_size:35360
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/build job_size:34553
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/test job_size:35361
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/add_write_perm job_size:35280
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/install job_size:35252
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/install_log job_size:38859
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/remove_write_perm job_size:35385
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.49/wipe_build job_size:35800
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/var_summary job_size:36010
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/git_srcs job_size:35983
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/make_build_dir job_size:34653
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/config job_size:35360
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/build job_size:34553
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/test job_size:35361
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/add_write_perm job_size:35280
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/install job_size:35252
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/install_log job_size:38859
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/remove_write_perm job_size:35385
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/gnu.53/wipe_build job_size:35800
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/var_summary job_size:36075
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/make_build_dir job_size:34722
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/config job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/build job_size:34614
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/test job_size:35422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/add_write_perm job_size:35341
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/install_log job_size:38926
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/remove_write_perm job_size:35446
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.14/wipe_build job_size:35865
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/var_summary job_size:36075
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/make_build_dir job_size:34722
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/config job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/build job_size:34614
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/test job_size:35422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/add_write_perm job_size:35341
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/install_log job_size:38926
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/remove_write_perm job_size:35446
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.15/wipe_build job_size:35865
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/var_summary job_size:36051
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/git_srcs job_size:36054
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/make_build_dir job_size:34698
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/config job_size:35401
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/build job_size:34590
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/test job_size:35398
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/add_write_perm job_size:35317
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/install job_size:35291
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/install_log job_size:38902
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/remove_write_perm job_size:35422
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/intel.16/wipe_build job_size:35841
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/var_summary job_size:35977
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/git_srcs job_size:35965
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/make_build_dir job_size:34622
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/config job_size:35327
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/build job_size:34518
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/test job_size:35326
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/add_write_perm job_size:35245
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/install job_size:35218
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/install_log job_size:38827
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/remove_write_perm job_size:35350
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.84/wipe_build job_size:35767
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/var_summary job_size:36005
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/git_srcs job_size:36008
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/make_build_dir job_size:34652
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/config job_size:35355
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/build job_size:34544
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/test job_size:35352
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/add_write_perm job_size:35271
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/install job_size:35245
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/install_log job_size:38856
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/remove_write_perm job_size:35376
-LOG:[12:55:57 13.4.2017]  submitted: /metkit/ccb/cray.846/wipe_build job_size:35795
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/regenerate job_size:15351
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/var_summary job_size:15522
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/git_srcs job_size:15544
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/make_build_dir job_size:14081
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/config job_size:15049
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/build job_size:14183
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/test job_size:15013
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/install job_size:14863
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/post_install job_size:14892
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/install_check job_size:16184
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/install_log job_size:18685
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/remove_write_perm job_size:14777
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/module_sync job_size:13724
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.49/wipe_build job_size:15322
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/var_summary job_size:15546
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/git_srcs job_size:15568
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/make_build_dir job_size:14105
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/config job_size:15073
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/build job_size:14207
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/test job_size:15037
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/install job_size:14887
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/post_install job_size:14916
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/install_check job_size:16208
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/install_log job_size:18709
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/remove_write_perm job_size:14801
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/module_sync job_size:13748
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxop_dev/gnu.53/wipe_build job_size:15346
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/var_summary job_size:36036
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/git_srcs job_size:36035
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/make_build_dir job_size:34678
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/config job_size:35488
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/build job_size:34574
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/test job_size:35382
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/install job_size:35272
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/post_install job_size:35406
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/install_check job_size:36725
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/install_log job_size:38893
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/remove_write_perm job_size:35404
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/module_sync job_size:34244
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.53/wipe_build job_size:35824
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/var_summary job_size:36036
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/git_srcs job_size:36035
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/make_build_dir job_size:34678
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/config job_size:35488
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/build job_size:34574
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/test job_size:35382
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/install job_size:35272
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/post_install job_size:35406
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/install_check job_size:36725
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/install_log job_size:38893
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/remove_write_perm job_size:35404
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/module_sync job_size:34244
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/gnu.62/wipe_build job_size:35824
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/var_summary job_size:36070
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/git_srcs job_size:36099
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/make_build_dir job_size:34716
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/config job_size:35522
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/build job_size:34604
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/test job_size:35412
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/install job_size:35304
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/post_install job_size:35436
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/install_check job_size:36757
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/install_log job_size:38929
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/remove_write_perm job_size:35434
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/module_sync job_size:34272
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/intel.17/wipe_build job_size:35858
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/var_summary job_size:36003
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/git_srcs job_size:36017
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/make_build_dir job_size:34647
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/config job_size:35455
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/build job_size:34539
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/test job_size:35347
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/install job_size:35238
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/post_install job_size:35371
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/install_check job_size:36691
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/install_log job_size:38861
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/remove_write_perm job_size:35369
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/module_sync job_size:34208
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cck/cray.85/wipe_build job_size:35791
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/var_summary job_size:36079
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/make_build_dir job_size:34721
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/config job_size:35550
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/build job_size:34617
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/test job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/post_install job_size:35449
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/install_check job_size:36768
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/install_log job_size:38936
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/remove_write_perm job_size:35447
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/module_sync job_size:34287
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.49/wipe_build job_size:35867
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/var_summary job_size:36079
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/make_build_dir job_size:34721
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/config job_size:35550
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/build job_size:34617
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/test job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/post_install job_size:35449
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/install_check job_size:36768
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/install_log job_size:38936
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/remove_write_perm job_size:35447
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/module_sync job_size:34287
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/gnu.53/wipe_build job_size:35867
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/var_summary job_size:36144
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/git_srcs job_size:36173
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/make_build_dir job_size:34790
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/config job_size:35635
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/build job_size:34678
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/test job_size:35486
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/install job_size:35378
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/post_install job_size:35510
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/install_check job_size:36831
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/install_log job_size:39003
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/remove_write_perm job_size:35508
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/module_sync job_size:34346
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.14/wipe_build job_size:35932
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/var_summary job_size:36144
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/git_srcs job_size:36173
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/make_build_dir job_size:34790
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/config job_size:35635
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/build job_size:34678
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/test job_size:35486
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/install job_size:35378
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/post_install job_size:35510
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/install_check job_size:36831
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/install_log job_size:39003
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/remove_write_perm job_size:35508
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/module_sync job_size:34346
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.15/wipe_build job_size:35932
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/var_summary job_size:36144
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/git_srcs job_size:36173
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/make_build_dir job_size:34790
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/config job_size:35635
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/build job_size:34678
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/test job_size:35486
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/install job_size:35378
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/post_install job_size:35510
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/install_check job_size:36831
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/install_log job_size:39003
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/remove_write_perm job_size:35508
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/module_sync job_size:34346
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/intel.16/wipe_build job_size:35932
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/var_summary job_size:36046
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/git_srcs job_size:36060
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/make_build_dir job_size:34690
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/config job_size:35602
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/build job_size:34582
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/test job_size:35390
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/install job_size:35281
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/post_install job_size:35414
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/install_check job_size:36734
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/install_log job_size:38904
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/remove_write_perm job_size:35412
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/module_sync job_size:34251
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.84/wipe_build job_size:35834
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/var_summary job_size:36046
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/git_srcs job_size:36060
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/make_build_dir job_size:34690
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/config job_size:35602
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/build job_size:34582
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/test job_size:35390
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/install job_size:35281
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/post_install job_size:35414
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/install_check job_size:36734
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/install_log job_size:38904
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/remove_write_perm job_size:35412
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/module_sync job_size:34251
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.85/wipe_build job_size:35834
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/var_summary job_size:36074
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/git_srcs job_size:36103
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/make_build_dir job_size:34720
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/config job_size:35630
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/build job_size:34608
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/test job_size:35416
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/install job_size:35308
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/post_install job_size:35440
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/install_check job_size:36761
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/install_log job_size:38933
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/remove_write_perm job_size:35438
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/module_sync job_size:34276
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cct/cray.846/wipe_build job_size:35862
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/var_summary job_size:15452
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/git_srcs job_size:15216
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/make_build_dir job_size:13961
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/config job_size:14895
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/build job_size:14127
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/test job_size:14957
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/install job_size:14750
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/post_install job_size:14798
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/install_check job_size:16071
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/install_log job_size:18148
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/remove_write_perm job_size:14680
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/module_sync job_size:13685
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappa/wipe_build job_size:15240
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/var_summary job_size:15462
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/git_srcs job_size:15370
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/make_build_dir job_size:13998
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/config job_size:14955
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/build job_size:14128
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/test job_size:14958
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/install job_size:14801
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/post_install job_size:14837
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/install_check job_size:16122
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/install_log job_size:18618
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/remove_write_perm job_size:14722
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/module_sync job_size:13676
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.44/wipe_build job_size:15248
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/var_summary job_size:15438
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/git_srcs job_size:15346
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/make_build_dir job_size:13974
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/config job_size:14931
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/build job_size:14104
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/test job_size:14934
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/install job_size:14777
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/post_install job_size:14813
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/install_check job_size:16098
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/install_log job_size:18594
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/remove_write_perm job_size:14698
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/module_sync job_size:13652
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/ecgb/gnu.53/wipe_build job_size:15224
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/var_summary job_size:15437
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/git_srcs job_size:15276
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/make_build_dir job_size:13956
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/config job_size:14921
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/build job_size:14102
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/test job_size:14932
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/install job_size:14771
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/post_install job_size:14808
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/install_check job_size:16092
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/install_log job_size:18589
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/remove_write_perm job_size:14696
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/module_sync job_size:13653
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/gnu.53/wipe_build job_size:15217
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/var_summary job_size:15497
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/git_srcs job_size:15366
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/make_build_dir job_size:14020
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/config job_size:14981
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/build job_size:14158
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/test job_size:14988
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/install job_size:14829
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/post_install job_size:14864
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/install_check job_size:16150
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/install_log job_size:18651
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/remove_write_perm job_size:14752
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/module_sync job_size:13707
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/intel.16/wipe_build job_size:15277
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/var_summary job_size:15475
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/git_srcs job_size:15314
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/make_build_dir job_size:13994
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/config job_size:14996
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/build job_size:14140
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/test job_size:14970
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/install job_size:14809
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/post_install job_size:14846
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/install_check job_size:16130
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/install_log job_size:18627
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/remove_write_perm job_size:14734
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/module_sync job_size:13691
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxg/pgi.16/wipe_build job_size:15255
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/var_summary job_size:15502
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/git_srcs job_size:15443
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/make_build_dir job_size:14032
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/config job_size:14999
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/build job_size:14150
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/test job_size:14980
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/install job_size:14826
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/post_install job_size:14880
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/install_check job_size:16147
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/install_log job_size:18661
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/remove_write_perm job_size:14744
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/module_sync job_size:13702
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.48/wipe_build job_size:15280
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/var_summary job_size:15526
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/git_srcs job_size:15467
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/make_build_dir job_size:14056
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/config job_size:15023
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/build job_size:14174
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/test job_size:15004
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/install job_size:14850
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/post_install job_size:14904
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/install_check job_size:16171
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/install_log job_size:18685
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/remove_write_perm job_size:14768
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/module_sync job_size:13726
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.53/wipe_build job_size:15304
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/var_summary job_size:15526
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/git_srcs job_size:15467
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/make_build_dir job_size:14056
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/config job_size:15023
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/build job_size:14174
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/test job_size:15004
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/install job_size:14850
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/post_install job_size:14904
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/install_check job_size:16171
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/install_log job_size:18685
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/remove_write_perm job_size:14768
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/module_sync job_size:13726
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/gnu.61/wipe_build job_size:15304
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/var_summary job_size:15528
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/git_srcs job_size:15424
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/make_build_dir job_size:14052
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/config job_size:15062
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/build job_size:14182
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/test job_size:15012
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/install job_size:14855
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/post_install job_size:14912
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/install_check job_size:16176
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/install_log job_size:18684
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/remove_write_perm job_size:14776
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/module_sync job_size:13737
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/opensuse131/pgi/wipe_build job_size:15306
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/var_summary job_size:15438
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/git_srcs job_size:15277
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/make_build_dir job_size:13957
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/config job_size:14922
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/build job_size:14103
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/test job_size:14933
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/install job_size:14772
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/post_install job_size:14809
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/install_check job_size:16093
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/install_log job_size:18590
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/remove_write_perm job_size:14697
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/module_sync job_size:13654
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.49/wipe_build job_size:15218
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/var_summary job_size:15462
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/git_srcs job_size:15301
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/make_build_dir job_size:13981
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/config job_size:14946
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/build job_size:14127
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/test job_size:14957
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/install job_size:14796
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/post_install job_size:14833
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/install_check job_size:16117
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/install_log job_size:18614
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/remove_write_perm job_size:14721
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/module_sync job_size:13678
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/gnu.53/wipe_build job_size:15242
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/var_summary job_size:15465
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/git_srcs job_size:15259
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/make_build_dir job_size:13978
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/config job_size:14986
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/build job_size:14136
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/test job_size:14966
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/install job_size:14802
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/post_install job_size:14842
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/install_check job_size:16123
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/install_log job_size:18614
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/remove_write_perm job_size:14730
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/module_sync job_size:13690
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/lxc/pgi/wipe_build job_size:15245
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/var_summary job_size:15452
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/git_srcs job_size:15318
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/make_build_dir job_size:13972
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/config job_size:14949
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/build job_size:14110
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/test job_size:14940
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/install job_size:14781
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/post_install job_size:14825
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/install_check job_size:16102
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/install_log job_size:18606
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/remove_write_perm job_size:14704
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/module_sync job_size:13662
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.53/wipe_build job_size:15230
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/var_summary job_size:15476
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/git_srcs job_size:15342
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/make_build_dir job_size:13996
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/config job_size:14973
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/build job_size:14134
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/test job_size:14964
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/install job_size:14805
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/post_install job_size:14849
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/install_check job_size:16126
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/install_log job_size:18630
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/remove_write_perm job_size:14728
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/module_sync job_size:13686
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/gnu.61/wipe_build job_size:15254
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/var_summary job_size:15478
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/git_srcs job_size:15299
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/make_build_dir job_size:13992
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/config job_size:15012
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/build job_size:14142
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/test job_size:14972
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/install job_size:14810
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/post_install job_size:14857
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/install_check job_size:16131
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/install_log job_size:18629
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/remove_write_perm job_size:14736
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/module_sync job_size:13697
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/leap42/pgi/wipe_build job_size:15256
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/var_summary job_size:15452
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/git_srcs job_size:15216
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/make_build_dir job_size:13961
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/config job_size:14895
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/build job_size:14127
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/test job_size:14957
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/install job_size:14750
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/post_install job_size:14798
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/install_check job_size:16071
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/install_log job_size:18148
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/remove_write_perm job_size:14680
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/module_sync job_size:13685
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/sappb/wipe_build job_size:15240
-WAR:[12:55:57 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/var_summary job_size:36079
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/make_build_dir job_size:34721
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/config job_size:35550
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/build job_size:34617
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/test job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/post_install job_size:35449
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/install_check job_size:36768
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/install_log job_size:38936
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/remove_write_perm job_size:35447
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/module_sync job_size:34287
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.49/wipe_build job_size:35867
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/var_summary job_size:36079
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/git_srcs job_size:36078
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/make_build_dir job_size:34721
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/config job_size:35550
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/build job_size:34617
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/test job_size:35425
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/install job_size:35315
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/post_install job_size:35449
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/install_check job_size:36768
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/install_log job_size:38936
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/remove_write_perm job_size:35447
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/module_sync job_size:34287
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/gnu.53/wipe_build job_size:35867
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/var_summary job_size:36144
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/git_srcs job_size:36173
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/make_build_dir job_size:34790
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/config job_size:35635
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/build job_size:34678
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/test job_size:35486
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/install job_size:35378
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/post_install job_size:35510
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/install_check job_size:36831
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/install_log job_size:39003
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/remove_write_perm job_size:35508
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/module_sync job_size:34346
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.14/wipe_build job_size:35932
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/var_summary job_size:36144
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/git_srcs job_size:36173
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/make_build_dir job_size:34790
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/config job_size:35635
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/build job_size:34678
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/test job_size:35486
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/install job_size:35378
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/post_install job_size:35510
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/install_check job_size:36831
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/install_log job_size:39003
-LOG:[12:55:57 13.4.2017]  submitted: /eccodes/cca/intel.15/remove_write_perm job_size:35508
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.15/module_sync job_size:34346
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.15/wipe_build job_size:35932
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/var_summary job_size:36120
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/git_srcs job_size:36149
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/make_build_dir job_size:34766
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/config job_size:35611
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/build job_size:34654
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/test job_size:35462
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/install job_size:35354
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/post_install job_size:35486
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/install_check job_size:36807
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/install_log job_size:38979
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/remove_write_perm job_size:35484
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/module_sync job_size:34322
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/intel.16/wipe_build job_size:35908
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/var_summary job_size:36046
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/git_srcs job_size:36060
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/make_build_dir job_size:34690
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/config job_size:35602
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/build job_size:34582
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/test job_size:35390
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/install job_size:35281
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/post_install job_size:35414
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/install_check job_size:36734
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/install_log job_size:38904
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/remove_write_perm job_size:35412
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/module_sync job_size:34251
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.84/wipe_build job_size:35834
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/var_summary job_size:36074
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/git_srcs job_size:36103
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/make_build_dir job_size:34720
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/config job_size:35630
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/build job_size:34608
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/test job_size:35416
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/install job_size:35308
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/post_install job_size:35440
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/install_check job_size:36761
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/install_log job_size:38933
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/remove_write_perm job_size:35438
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/module_sync job_size:34276
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/cca/cray.846/wipe_build job_size:35862
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/var_summary job_size:36079
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/git_srcs job_size:36078
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/make_build_dir job_size:34721
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/config job_size:35550
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/build job_size:34617
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/test job_size:35425
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/install job_size:35315
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/post_install job_size:35449
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/install_check job_size:36768
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/install_log job_size:38936
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/remove_write_perm job_size:35447
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/module_sync job_size:34287
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.49/wipe_build job_size:35867
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/var_summary job_size:36079
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/git_srcs job_size:36078
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/make_build_dir job_size:34721
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/config job_size:35550
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/build job_size:34617
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/test job_size:35425
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/install job_size:35315
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/post_install job_size:35449
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/install_check job_size:36768
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/install_log job_size:38936
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/remove_write_perm job_size:35447
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/module_sync job_size:34287
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/gnu.53/wipe_build job_size:35867
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/var_summary job_size:36144
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/git_srcs job_size:36173
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/make_build_dir job_size:34790
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/config job_size:35635
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/build job_size:34678
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/test job_size:35486
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/install job_size:35378
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/post_install job_size:35510
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/install_check job_size:36831
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/install_log job_size:39003
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/remove_write_perm job_size:35508
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/module_sync job_size:34346
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.14/wipe_build job_size:35932
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/var_summary job_size:36144
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/git_srcs job_size:36173
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/make_build_dir job_size:34790
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/config job_size:35635
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/build job_size:34678
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/test job_size:35486
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/install job_size:35378
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/post_install job_size:35510
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/install_check job_size:36831
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/install_log job_size:39003
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/remove_write_perm job_size:35508
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/module_sync job_size:34346
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.15/wipe_build job_size:35932
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/var_summary job_size:36120
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/git_srcs job_size:36149
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/make_build_dir job_size:34766
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/config job_size:35611
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/build job_size:34654
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/test job_size:35462
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/install job_size:35354
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/post_install job_size:35486
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/install_check job_size:36807
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/install_log job_size:38979
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/remove_write_perm job_size:35484
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/module_sync job_size:34322
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/intel.16/wipe_build job_size:35908
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/var_summary job_size:36046
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/git_srcs job_size:36060
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/make_build_dir job_size:34690
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/config job_size:35602
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/build job_size:34582
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/test job_size:35390
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/install job_size:35281
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/post_install job_size:35414
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/install_check job_size:36734
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/install_log job_size:38904
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/remove_write_perm job_size:35412
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/module_sync job_size:34251
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.84/wipe_build job_size:35834
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/var_summary job_size:36074
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/git_srcs job_size:36103
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/make_build_dir job_size:34720
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/config job_size:35630
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/build job_size:34608
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/test job_size:35416
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/install job_size:35308
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/post_install job_size:35440
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/install_check job_size:36761
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/install_log job_size:38933
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/remove_write_perm job_size:35438
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/module_sync job_size:34276
-LOG:[12:55:58 13.4.2017]  submitted: /eccodes/ccb/cray.846/wipe_build job_size:35862
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/regenerate job_size:15353
-LOG:[12:55:58 13.4.2017]  submitted: /libemos
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/var_summary job_size:15524
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/git_srcs job_size:15540
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/make_build_dir job_size:14083
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/config job_size:15077
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/build job_size:14185
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/test job_size:15015
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/add_write_perm job_size:14746
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/install job_size:15097
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/install_log job_size:18693
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/remove_write_perm job_size:14785
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/module_sync job_size:13726
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.49/wipe_build job_size:15324
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/var_summary job_size:15548
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/git_srcs job_size:15564
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/make_build_dir job_size:14107
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/config job_size:15101
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/build job_size:14209
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/test job_size:15039
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/add_write_perm job_size:14770
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/install job_size:15121
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/install_log job_size:18717
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/remove_write_perm job_size:14809
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/module_sync job_size:13750
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxop_dev/gnu.53/wipe_build job_size:15348
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/var_summary job_size:36085
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/git_srcs job_size:36078
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/make_build_dir job_size:34727
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/config job_size:35563
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/build job_size:34623
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/test job_size:35431
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/add_write_perm job_size:35354
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/install job_size:35553
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/install_log job_size:38948
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/remove_write_perm job_size:35459
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/module_sync job_size:34293
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.53/wipe_build job_size:35873
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/var_summary job_size:36085
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/git_srcs job_size:36078
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/make_build_dir job_size:34727
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/config job_size:35563
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/build job_size:34623
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/test job_size:35431
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/add_write_perm job_size:35354
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/install job_size:35553
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/install_log job_size:38948
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/remove_write_perm job_size:35459
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/module_sync job_size:34293
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/gnu.62/wipe_build job_size:35873
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/var_summary job_size:36119
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/git_srcs job_size:36142
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/make_build_dir job_size:34765
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/config job_size:35597
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/build job_size:34653
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/test job_size:35461
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/add_write_perm job_size:35384
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/install job_size:35585
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/install_log job_size:38984
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/remove_write_perm job_size:35489
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/module_sync job_size:34321
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/intel.17/wipe_build job_size:35907
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/var_summary job_size:36052
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/git_srcs job_size:36060
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/make_build_dir job_size:34696
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/config job_size:35530
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/build job_size:34588
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/test job_size:35396
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/add_write_perm job_size:35319
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/install job_size:35519
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/install_log job_size:38916
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/remove_write_perm job_size:35424
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/module_sync job_size:34257
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cck/cray.85/wipe_build job_size:35840
-WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/var_summary job_size:36126
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/git_srcs job_size:36119
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/make_build_dir job_size:34768
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/config job_size:35629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/build job_size:34664
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/test job_size:35472
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/add_write_perm job_size:35395
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/install job_size:35594
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/install_log job_size:38989
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/remove_write_perm job_size:35500
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/module_sync job_size:34334
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.49/wipe_build job_size:35914
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/var_summary job_size:36126
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/git_srcs job_size:36119
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/make_build_dir job_size:34768
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/config job_size:35629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/build job_size:34664
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/test job_size:35472
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/add_write_perm job_size:35395
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/install job_size:35594
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/install_log job_size:38989
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/remove_write_perm job_size:35500
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/module_sync job_size:34334
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/gnu.53/wipe_build job_size:35914
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/var_summary job_size:36191
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/git_srcs job_size:36214
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/make_build_dir job_size:34837
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/config job_size:35694
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/build job_size:34725
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/test job_size:35533
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/add_write_perm job_size:35456
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/install job_size:35657
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/install_log job_size:39056
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/remove_write_perm job_size:35561
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/module_sync job_size:34393
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.14/wipe_build job_size:35979
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/var_summary job_size:36191
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/git_srcs job_size:36214
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/make_build_dir job_size:34837
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/config job_size:35694
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/build job_size:34725
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/test job_size:35533
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/add_write_perm job_size:35456
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/install job_size:35657
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/install_log job_size:39056
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/remove_write_perm job_size:35561
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/module_sync job_size:34393
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.15/wipe_build job_size:35979
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/var_summary job_size:36191
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/git_srcs job_size:36214
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/make_build_dir job_size:34837
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/config job_size:35694
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/build job_size:34725
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/test job_size:35533
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/add_write_perm job_size:35456
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/install job_size:35657
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/install_log job_size:39056
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/remove_write_perm job_size:35561
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/module_sync job_size:34393
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/intel.16/wipe_build job_size:35979
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/var_summary job_size:36093
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/git_srcs job_size:36101
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/make_build_dir job_size:34737
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/config job_size:35624
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/build job_size:34629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/test job_size:35437
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/add_write_perm job_size:35360
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/install job_size:35560
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/install_log job_size:38957
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/remove_write_perm job_size:35465
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/module_sync job_size:34298
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.84/wipe_build job_size:35881
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/var_summary job_size:36093
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/git_srcs job_size:36101
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/make_build_dir job_size:34737
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/config job_size:35624
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/build job_size:34629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/test job_size:35437
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/add_write_perm job_size:35360
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/install job_size:35560
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/install_log job_size:38957
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/remove_write_perm job_size:35465
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/module_sync job_size:34298
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.85/wipe_build job_size:35881
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/var_summary job_size:36121
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/git_srcs job_size:36144
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/make_build_dir job_size:34767
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/config job_size:35652
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/build job_size:34655
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/test job_size:35463
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/add_write_perm job_size:35386
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/install job_size:35587
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/install_log job_size:38986
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/remove_write_perm job_size:35491
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/module_sync job_size:34323
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cct/cray.846/wipe_build job_size:35909
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/var_summary job_size:15405
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/git_srcs job_size:15163
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/make_build_dir job_size:13914
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/config job_size:14901
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/build job_size:14080
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/test job_size:14910
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/add_write_perm job_size:14600
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/install job_size:14935
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/install_log job_size:18107
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/remove_write_perm job_size:14639
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/module_sync job_size:13638
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappa/wipe_build job_size:15193
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/var_summary job_size:15483
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/git_srcs job_size:15385
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/make_build_dir job_size:14019
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/config job_size:15002
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/build job_size:14149
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/test job_size:14979
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/add_write_perm job_size:14710
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/install job_size:15054
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/install_log job_size:18645
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/remove_write_perm job_size:14749
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/module_sync job_size:13697
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.44/wipe_build job_size:15269
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/var_summary job_size:15459
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/git_srcs job_size:15361
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/make_build_dir job_size:13995
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/config job_size:14978
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/build job_size:14125
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/test job_size:14955
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/add_write_perm job_size:14686
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/install job_size:15030
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/install_log job_size:18621
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/remove_write_perm job_size:14725
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/module_sync job_size:13673
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ecgb/gnu.53/wipe_build job_size:15245
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/var_summary job_size:15445
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/git_srcs job_size:15278
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/make_build_dir job_size:13964
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/config job_size:14955
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/build job_size:14110
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/test job_size:14940
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/add_write_perm job_size:14671
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/install job_size:15011
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/install_log job_size:18603
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/remove_write_perm job_size:14710
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/module_sync job_size:13661
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/gnu.53/wipe_build job_size:15225
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/var_summary job_size:15505
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/git_srcs job_size:15368
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/make_build_dir job_size:14028
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/config job_size:15015
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/build job_size:14166
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/test job_size:14996
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/add_write_perm job_size:14727
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/install job_size:15069
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/install_log job_size:18665
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/remove_write_perm job_size:14766
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/module_sync job_size:13715
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/intel.16/wipe_build job_size:15285
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/var_summary job_size:15483
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/git_srcs job_size:15316
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/make_build_dir job_size:14002
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/config job_size:14993
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/build job_size:14148
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/test job_size:14978
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/add_write_perm job_size:14709
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/install job_size:15049
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/install_log job_size:18641
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/remove_write_perm job_size:14748
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/module_sync job_size:13699
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxg/pgi.16/wipe_build job_size:15263
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/var_summary job_size:15544
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/git_srcs job_size:15479
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/make_build_dir job_size:14074
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/config job_size:15051
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/build job_size:14192
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/test job_size:15022
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/add_write_perm job_size:14753
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/install job_size:15100
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/install_log job_size:18709
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/remove_write_perm job_size:14792
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/module_sync job_size:13744
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.48/wipe_build job_size:15322
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/var_summary job_size:15547
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/git_srcs job_size:15482
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/make_build_dir job_size:14077
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/config job_size:15054
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/build job_size:14195
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/test job_size:15025
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/add_write_perm job_size:14756
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/install job_size:15103
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/install_log job_size:18712
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/remove_write_perm job_size:14795
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/module_sync job_size:13747
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.53/wipe_build job_size:15325
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/var_summary job_size:15547
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/git_srcs job_size:15482
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/make_build_dir job_size:14077
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/config job_size:15054
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/build job_size:14195
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/test job_size:15025
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/add_write_perm job_size:14756
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/install job_size:15103
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/install_log job_size:18712
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/remove_write_perm job_size:14795
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/module_sync job_size:13747
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/gnu.61/wipe_build job_size:15325
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/var_summary job_size:15565
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/git_srcs job_size:15455
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/make_build_dir job_size:14089
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/config job_size:15130
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/build job_size:14219
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/test job_size:15049
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/add_write_perm job_size:14780
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/install job_size:15124
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/install_log job_size:18727
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/remove_write_perm job_size:14819
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/module_sync job_size:13774
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/opensuse131/pgi/wipe_build job_size:15343
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/var_summary job_size:15446
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/git_srcs job_size:15279
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/make_build_dir job_size:13965
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/config job_size:14956
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/build job_size:14111
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/test job_size:14941
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/add_write_perm job_size:14672
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/install job_size:15012
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/install_log job_size:18604
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/remove_write_perm job_size:14711
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/module_sync job_size:13662
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.49/wipe_build job_size:15226
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/var_summary job_size:15470
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/git_srcs job_size:15303
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/make_build_dir job_size:13989
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/config job_size:14980
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/build job_size:14135
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/test job_size:14965
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/add_write_perm job_size:14696
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/install job_size:15036
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/install_log job_size:18628
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/remove_write_perm job_size:14735
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/module_sync job_size:13686
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/gnu.53/wipe_build job_size:15250
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/var_summary job_size:15488
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/git_srcs job_size:15276
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/make_build_dir job_size:14001
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/config job_size:15056
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/build job_size:14159
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/test job_size:14989
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/add_write_perm job_size:14720
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/install job_size:15057
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/install_log job_size:18643
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/remove_write_perm job_size:14759
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/module_sync job_size:13713
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/lxc/pgi/wipe_build job_size:15268
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/var_summary job_size:15473
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/git_srcs job_size:15333
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/make_build_dir job_size:13993
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/config job_size:14980
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/build job_size:14131
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/test job_size:14961
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/add_write_perm job_size:14692
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/install job_size:15034
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/install_log job_size:18633
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/remove_write_perm job_size:14731
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/module_sync job_size:13683
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.53/wipe_build job_size:15251
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/var_summary job_size:15497
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/git_srcs job_size:15357
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/make_build_dir job_size:14017
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/config job_size:15004
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/build job_size:14155
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/test job_size:14985
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/add_write_perm job_size:14716
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/install job_size:15058
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/install_log job_size:18657
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/remove_write_perm job_size:14755
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/module_sync job_size:13707
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/gnu.61/wipe_build job_size:15275
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/var_summary job_size:15515
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/git_srcs job_size:15330
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/make_build_dir job_size:14029
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/config job_size:15080
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/build job_size:14179
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/test job_size:15009
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/add_write_perm job_size:14740
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/install job_size:15079
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/install_log job_size:18672
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/remove_write_perm job_size:14779
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/module_sync job_size:13734
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/leap42/pgi/wipe_build job_size:15293
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/var_summary job_size:15405
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/git_srcs job_size:15163
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/make_build_dir job_size:13914
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/config job_size:14901
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/build job_size:14080
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/test job_size:14910
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/add_write_perm job_size:14600
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/install job_size:14935
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/install_log job_size:18107
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/remove_write_perm job_size:14639
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/module_sync job_size:13638
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/sappb/wipe_build job_size:15193
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/var_summary job_size:36126
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/git_srcs job_size:36119
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/make_build_dir job_size:34768
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/config job_size:35629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/build job_size:34664
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/test job_size:35472
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/add_write_perm job_size:35395
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/install job_size:35594
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/install_log job_size:38989
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/remove_write_perm job_size:35500
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/module_sync job_size:34334
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.49/wipe_build job_size:35914
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/var_summary job_size:36126
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/git_srcs job_size:36119
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/make_build_dir job_size:34768
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/config job_size:35629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/build job_size:34664
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/test job_size:35472
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/add_write_perm job_size:35395
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/install job_size:35594
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/install_log job_size:38989
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/remove_write_perm job_size:35500
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/module_sync job_size:34334
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/gnu.53/wipe_build job_size:35914
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/var_summary job_size:36191
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/git_srcs job_size:36214
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/make_build_dir job_size:34837
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/config job_size:35694
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/build job_size:34725
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/test job_size:35533
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/add_write_perm job_size:35456
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/install job_size:35657
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/install_log job_size:39056
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/remove_write_perm job_size:35561
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/module_sync job_size:34393
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.14/wipe_build job_size:35979
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/var_summary job_size:36191
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/git_srcs job_size:36214
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/make_build_dir job_size:34837
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/config job_size:35694
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/build job_size:34725
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/test job_size:35533
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/add_write_perm job_size:35456
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/install job_size:35657
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/install_log job_size:39056
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/remove_write_perm job_size:35561
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/module_sync job_size:34393
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.15/wipe_build job_size:35979
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/var_summary job_size:36167
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/git_srcs job_size:36190
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/make_build_dir job_size:34813
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/config job_size:35670
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/build job_size:34701
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/test job_size:35509
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/add_write_perm job_size:35432
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/install job_size:35633
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/install_log job_size:39032
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/remove_write_perm job_size:35537
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/module_sync job_size:34369
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/intel.16/wipe_build job_size:35955
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/var_summary job_size:36093
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/git_srcs job_size:36101
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/make_build_dir job_size:34737
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/config job_size:35624
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/build job_size:34629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/test job_size:35437
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/add_write_perm job_size:35360
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/install job_size:35560
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/install_log job_size:38957
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/remove_write_perm job_size:35465
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/module_sync job_size:34298
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.84/wipe_build job_size:35881
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/var_summary job_size:36121
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/git_srcs job_size:36144
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/make_build_dir job_size:34767
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/config job_size:35652
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/build job_size:34655
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/test job_size:35463
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/add_write_perm job_size:35386
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/install job_size:35587
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/install_log job_size:38986
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/remove_write_perm job_size:35491
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/module_sync job_size:34323
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/cca/cray.846/wipe_build job_size:35909
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/var_summary job_size:36126
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/git_srcs job_size:36119
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/make_build_dir job_size:34768
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/config job_size:35629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/build job_size:34664
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/test job_size:35472
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/add_write_perm job_size:35395
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/install job_size:35594
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/install_log job_size:38989
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/remove_write_perm job_size:35500
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/module_sync job_size:34334
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.49/wipe_build job_size:35914
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/var_summary job_size:36126
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/git_srcs job_size:36119
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/make_build_dir job_size:34768
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/config job_size:35629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/build job_size:34664
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/test job_size:35472
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/add_write_perm job_size:35395
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/install job_size:35594
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/install_log job_size:38989
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/remove_write_perm job_size:35500
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/module_sync job_size:34334
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/gnu.53/wipe_build job_size:35914
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/var_summary job_size:36191
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/git_srcs job_size:36214
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/make_build_dir job_size:34837
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/config job_size:35694
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/build job_size:34725
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/test job_size:35533
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/add_write_perm job_size:35456
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/install job_size:35657
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/install_log job_size:39056
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/remove_write_perm job_size:35561
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/module_sync job_size:34393
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.14/wipe_build job_size:35979
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/var_summary job_size:36191
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/git_srcs job_size:36214
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/make_build_dir job_size:34837
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/config job_size:35694
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/build job_size:34725
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/test job_size:35533
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/add_write_perm job_size:35456
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/install job_size:35657
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/install_log job_size:39056
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/remove_write_perm job_size:35561
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/module_sync job_size:34393
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.15/wipe_build job_size:35979
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/var_summary job_size:36167
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/git_srcs job_size:36190
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/make_build_dir job_size:34813
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/config job_size:35670
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/build job_size:34701
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/test job_size:35509
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/add_write_perm job_size:35432
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/install job_size:35633
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/install_log job_size:39032
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/remove_write_perm job_size:35537
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/module_sync job_size:34369
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/intel.16/wipe_build job_size:35955
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/var_summary job_size:36093
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/git_srcs job_size:36101
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/make_build_dir job_size:34737
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/config job_size:35624
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/build job_size:34629
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/test job_size:35437
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/add_write_perm job_size:35360
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/install job_size:35560
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/install_log job_size:38957
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/remove_write_perm job_size:35465
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/module_sync job_size:34298
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.84/wipe_build job_size:35881
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/var_summary job_size:36121
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/git_srcs job_size:36144
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/make_build_dir job_size:34767
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/config job_size:35652
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/build job_size:34655
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/test job_size:35463
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/add_write_perm job_size:35386
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/install job_size:35587
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/install_log job_size:38986
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/remove_write_perm job_size:35491
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/module_sync job_size:34323
-LOG:[12:55:58 13.4.2017]  submitted: /libemos/ccb/cray.846/wipe_build job_size:35909
-WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/regenerate job_size:15353
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/var_summary job_size:15389
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/git_srcs job_size:15320
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/make_build_dir job_size:13939
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/config job_size:14847
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/build job_size:14065
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/test job_size:14895
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/add_write_perm job_size:14584
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/install job_size:14703
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/install_log job_size:18100
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/remove_write_perm job_size:14623
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/module_sync job_size:13612
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxop_dev/wipe_build job_size:15191
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/var_summary job_size:35714
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/git_srcs job_size:35622
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/make_build_dir job_size:34347
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/config job_size:35127
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/build job_size:34267
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/test job_size:35075
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/add_write_perm job_size:34984
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/install job_size:34951
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/install_log job_size:38427
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/remove_write_perm job_size:35089
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/module_sync job_size:33943
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cck/wipe_build job_size:35504
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/var_summary job_size:35771
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/git_srcs job_size:35679
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/make_build_dir job_size:34404
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/config job_size:35184
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/build job_size:34324
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/test job_size:35132
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/add_write_perm job_size:35041
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/install job_size:35008
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/install_log job_size:38484
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/remove_write_perm job_size:35146
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/module_sync job_size:34000
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cct/wipe_build job_size:35561
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/var_summary job_size:15349
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/git_srcs job_size:15109
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/make_build_dir job_size:13858
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/config job_size:14751
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/build job_size:14024
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/test job_size:14854
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/add_write_perm job_size:14543
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/install job_size:14652
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/install_log job_size:18050
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/remove_write_perm job_size:14582
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/module_sync job_size:13582
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappa/wipe_build job_size:15137
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/var_summary job_size:15320
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/git_srcs job_size:15137
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/make_build_dir job_size:13847
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/config job_size:14737
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/build job_size:14001
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/test job_size:14831
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/add_write_perm job_size:14520
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/install job_size:14632
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/install_log job_size:18024
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/remove_write_perm job_size:14559
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/module_sync job_size:13555
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ecgb/wipe_build job_size:15108
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/var_summary job_size:15305
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/git_srcs job_size:15053
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/make_build_dir job_size:13815
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/config job_size:14709
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/build job_size:13985
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/test job_size:14815
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/add_write_perm job_size:14504
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/install job_size:14612
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/install_log job_size:18005
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/remove_write_perm job_size:14543
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/module_sync job_size:13542
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxg/wipe_build job_size:15087
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/var_summary job_size:15391
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/git_srcs job_size:15241
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/make_build_dir job_size:13912
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/config job_size:14799
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/build job_size:14054
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/test job_size:14884
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/add_write_perm job_size:14573
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/install job_size:14688
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/install_log job_size:18098
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/remove_write_perm job_size:14612
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/module_sync job_size:13612
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/opensuse131/wipe_build job_size:15171
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/var_summary job_size:15306
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/git_srcs job_size:15054
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/make_build_dir job_size:13816
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/config job_size:14710
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/build job_size:13986
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/test job_size:14816
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/add_write_perm job_size:14505
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/install job_size:14613
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/install_log job_size:18006
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/remove_write_perm job_size:14544
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/module_sync job_size:13543
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/lxc/wipe_build job_size:15088
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/var_summary job_size:15336
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/git_srcs job_size:15111
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/make_build_dir job_size:13847
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/config job_size:14739
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/build job_size:14009
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/test job_size:14839
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/add_write_perm job_size:14528
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/install job_size:14638
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/install_log job_size:18038
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/remove_write_perm job_size:14567
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/module_sync job_size:13567
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/leap42/wipe_build job_size:15116
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/var_summary job_size:15349
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/git_srcs job_size:15109
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/make_build_dir job_size:13858
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/config job_size:14751
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/build job_size:14024
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/test job_size:14854
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/add_write_perm job_size:14543
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/install job_size:14652
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/install_log job_size:18050
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/remove_write_perm job_size:14582
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/module_sync job_size:13582
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/sappb/wipe_build job_size:15137
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/var_summary job_size:35771
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/git_srcs job_size:35679
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/make_build_dir job_size:34404
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/config job_size:35184
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/build job_size:34324
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/test job_size:35132
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/add_write_perm job_size:35041
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/install job_size:35008
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/install_log job_size:38484
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/remove_write_perm job_size:35146
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/module_sync job_size:34000
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/cca/wipe_build job_size:35561
-WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/var_summary job_size:35771
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/git_srcs job_size:35679
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/make_build_dir job_size:34404
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/config job_size:35184
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/build job_size:34324
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/test job_size:35132
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/add_write_perm job_size:35041
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/install job_size:35008
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/install_log job_size:38484
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/remove_write_perm job_size:35146
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/module_sync job_size:34000
-LOG:[12:55:58 13.4.2017]  submitted: /ecbuild/ccb/wipe_build job_size:35561
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/regenerate job_size:15277
-LOG:[12:55:58 13.4.2017]  submitted: /fdb
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/var_summary job_size:35830
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/git_srcs job_size:35751
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/make_build_dir job_size:34476
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/config job_size:35240
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/build job_size:34388
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/test job_size:35196
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/install job_size:35075
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/install_log job_size:38640
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/remove_write_perm job_size:35211
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/module_sync job_size:34058
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.49/wipe_build job_size:35626
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/var_summary job_size:35830
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/git_srcs job_size:35751
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/make_build_dir job_size:34476
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/config job_size:35240
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/build job_size:34388
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/test job_size:35196
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/install job_size:35075
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/install_log job_size:38640
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/remove_write_perm job_size:35211
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/module_sync job_size:34058
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/gnu.53/wipe_build job_size:35626
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/var_summary job_size:35895
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/git_srcs job_size:35846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/make_build_dir job_size:34545
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/config job_size:35305
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/build job_size:34449
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/test job_size:35257
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/install job_size:35138
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/install_log job_size:38707
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/remove_write_perm job_size:35272
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/module_sync job_size:34117
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.14/wipe_build job_size:35691
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/var_summary job_size:35895
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/git_srcs job_size:35846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/make_build_dir job_size:34545
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/config job_size:35305
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/build job_size:34449
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/test job_size:35257
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/install job_size:35138
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/install_log job_size:38707
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/remove_write_perm job_size:35272
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/module_sync job_size:34117
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.15/wipe_build job_size:35691
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/var_summary job_size:35871
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/git_srcs job_size:35822
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/make_build_dir job_size:34521
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/config job_size:35281
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/build job_size:34425
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/test job_size:35233
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/install job_size:35114
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/install_log job_size:38683
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/remove_write_perm job_size:35248
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/module_sync job_size:34093
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/intel.16/wipe_build job_size:35667
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/var_summary job_size:35797
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/git_srcs job_size:35733
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/make_build_dir job_size:34445
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/config job_size:35207
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/build job_size:34353
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/test job_size:35161
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/install job_size:35041
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/install_log job_size:38608
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/remove_write_perm job_size:35176
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/module_sync job_size:34022
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.84/wipe_build job_size:35593
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/var_summary job_size:35825
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/git_srcs job_size:35776
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/make_build_dir job_size:34475
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/config job_size:35235
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/build job_size:34379
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/test job_size:35187
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/install job_size:35068
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/install_log job_size:38637
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/remove_write_perm job_size:35202
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/module_sync job_size:34047
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cca/cray.846/wipe_build job_size:35621
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/var_summary job_size:35830
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/git_srcs job_size:35751
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/make_build_dir job_size:34476
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/config job_size:35240
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/build job_size:34388
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/test job_size:35196
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/install job_size:35075
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/install_log job_size:38640
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/remove_write_perm job_size:35211
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/module_sync job_size:34058
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.49/wipe_build job_size:35626
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/var_summary job_size:35830
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/git_srcs job_size:35751
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/make_build_dir job_size:34476
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/config job_size:35240
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/build job_size:34388
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/test job_size:35196
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/install job_size:35075
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/install_log job_size:38640
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/remove_write_perm job_size:35211
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/module_sync job_size:34058
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/gnu.53/wipe_build job_size:35626
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/var_summary job_size:35895
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/git_srcs job_size:35846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/make_build_dir job_size:34545
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/config job_size:35305
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/build job_size:34449
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/test job_size:35257
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/install job_size:35138
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/install_log job_size:38707
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/remove_write_perm job_size:35272
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/module_sync job_size:34117
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.14/wipe_build job_size:35691
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/var_summary job_size:35895
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/git_srcs job_size:35846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/make_build_dir job_size:34545
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/config job_size:35305
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/build job_size:34449
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/test job_size:35257
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/install job_size:35138
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/install_log job_size:38707
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/remove_write_perm job_size:35272
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/module_sync job_size:34117
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.15/wipe_build job_size:35691
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/var_summary job_size:35871
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/git_srcs job_size:35822
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/make_build_dir job_size:34521
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/config job_size:35281
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/build job_size:34425
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/test job_size:35233
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/install job_size:35114
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/install_log job_size:38683
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/remove_write_perm job_size:35248
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/module_sync job_size:34093
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/intel.16/wipe_build job_size:35667
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/var_summary job_size:35797
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/git_srcs job_size:35733
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/make_build_dir job_size:34445
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/config job_size:35207
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/build job_size:34353
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/test job_size:35161
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/install job_size:35041
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/install_log job_size:38608
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/remove_write_perm job_size:35176
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/module_sync job_size:34022
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.84/wipe_build job_size:35593
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/var_summary job_size:35825
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/git_srcs job_size:35776
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/make_build_dir job_size:34475
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/config job_size:35235
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/build job_size:34379
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/test job_size:35187
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/install job_size:35068
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/install_log job_size:38637
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/remove_write_perm job_size:35202
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/module_sync job_size:34047
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/ccb/cray.846/wipe_build job_size:35621
-WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/var_summary job_size:35830
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/git_srcs job_size:35751
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/make_build_dir job_size:34476
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/config job_size:35240
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/build job_size:34388
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/test job_size:35196
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/install job_size:35075
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/install_log job_size:38640
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/remove_write_perm job_size:35211
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/module_sync job_size:34058
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.49/wipe_build job_size:35626
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/var_summary job_size:35830
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/git_srcs job_size:35751
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/make_build_dir job_size:34476
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/config job_size:35240
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/build job_size:34388
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/test job_size:35196
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/install job_size:35075
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/install_log job_size:38640
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/remove_write_perm job_size:35211
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/module_sync job_size:34058
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/gnu.53/wipe_build job_size:35626
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/var_summary job_size:35895
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/git_srcs job_size:35846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/make_build_dir job_size:34545
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/config job_size:35305
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/build job_size:34449
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/test job_size:35257
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/install job_size:35138
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/install_log job_size:38707
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/remove_write_perm job_size:35272
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/module_sync job_size:34117
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.14/wipe_build job_size:35691
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/var_summary job_size:35895
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/git_srcs job_size:35846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/make_build_dir job_size:34545
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/config job_size:35305
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/build job_size:34449
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/test job_size:35257
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/install job_size:35138
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/install_log job_size:38707
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/remove_write_perm job_size:35272
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/module_sync job_size:34117
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.15/wipe_build job_size:35691
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/var_summary job_size:35895
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/git_srcs job_size:35846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/make_build_dir job_size:34545
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/config job_size:35305
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/build job_size:34449
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/test job_size:35257
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/install job_size:35138
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/install_log job_size:38707
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/remove_write_perm job_size:35272
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/module_sync job_size:34117
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/intel.16/wipe_build job_size:35691
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/var_summary job_size:35797
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/git_srcs job_size:35733
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/make_build_dir job_size:34445
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/config job_size:35207
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/build job_size:34353
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/test job_size:35161
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/install job_size:35041
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/install_log job_size:38608
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/remove_write_perm job_size:35176
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/module_sync job_size:34022
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.84/wipe_build job_size:35593
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/var_summary job_size:35797
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/git_srcs job_size:35733
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/make_build_dir job_size:34445
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/config job_size:35207
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/build job_size:34353
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/test job_size:35161
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/install job_size:35041
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/install_log job_size:38608
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/remove_write_perm job_size:35176
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/module_sync job_size:34022
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.85/wipe_build job_size:35593
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/var_summary job_size:35825
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/git_srcs job_size:35776
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/make_build_dir job_size:34475
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/config job_size:35235
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/build job_size:34379
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/test job_size:35187
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/install job_size:35068
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/install_log job_size:38637
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/remove_write_perm job_size:35202
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/module_sync job_size:34047
-LOG:[12:55:58 13.4.2017]  submitted: /fdb/cct/cray.846/wipe_build job_size:35621
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/regenerate job_size:15467
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxop_dev/var_summary job_size:15489
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxop_dev
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxop_dev/git_srcs job_size:15555
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxop_dev/make_build_dir job_size:14033
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxop_dev/config job_size:14898
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxop_dev/install job_size:14790
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxop_dev/install_log job_size:18081
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxop_dev/remove_write_perm job_size:14751
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cck/var_summary job_size:36048
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cck
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cck/git_srcs job_size:36091
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cck/make_build_dir job_size:34675
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cck/config job_size:35410
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cck/install job_size:35272
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cck/install_log job_size:38642
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cck/remove_write_perm job_size:35453
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cct/var_summary job_size:36068
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cct
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cct/git_srcs job_size:36111
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cct/make_build_dir job_size:34695
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cct/config job_size:35430
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cct/install job_size:35292
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cct/install_log job_size:38662
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cct/remove_write_perm job_size:35473
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappa/var_summary job_size:15467
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappa
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappa/git_srcs job_size:15362
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappa/make_build_dir job_size:13970
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappa/config job_size:14830
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappa/install job_size:14757
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappa/install_log job_size:18049
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappa/remove_write_perm job_size:14718
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ecgb/var_summary job_size:15420
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ecgb
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ecgb/git_srcs job_size:15372
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ecgb/make_build_dir job_size:13941
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ecgb/config job_size:14795
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ecgb/install job_size:14719
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ecgb/install_log job_size:18005
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ecgb/remove_write_perm job_size:14680
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxg/var_summary job_size:15405
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxg
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxg/git_srcs job_size:15288
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxg/make_build_dir job_size:13909
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxg/config job_size:14771
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxg/install job_size:14699
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxg/install_log job_size:17986
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxg/remove_write_perm job_size:14660
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/opensuse131/var_summary job_size:15491
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/opensuse131
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/opensuse131/git_srcs job_size:15476
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/opensuse131/make_build_dir job_size:14006
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/opensuse131/config job_size:14854
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/opensuse131/install job_size:14775
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/opensuse131/install_log job_size:18079
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/opensuse131/remove_write_perm job_size:14736
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxc/var_summary job_size:15406
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxc
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxc/git_srcs job_size:15289
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxc/make_build_dir job_size:13910
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxc/config job_size:14772
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxc/install job_size:14700
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxc/install_log job_size:17987
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/lxc/remove_write_perm job_size:14661
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/leap42/var_summary job_size:15436
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/leap42
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/leap42/git_srcs job_size:15346
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/leap42/make_build_dir job_size:13941
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/leap42/config job_size:14799
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/leap42/install job_size:14725
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/leap42/install_log job_size:18019
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/leap42/remove_write_perm job_size:14686
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappb/var_summary job_size:15467
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappb
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappb/git_srcs job_size:15362
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappb/make_build_dir job_size:13970
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappb/config job_size:14830
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappb/install job_size:14757
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappb/install_log job_size:18049
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/sappb/remove_write_perm job_size:14718
-WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cca/var_summary job_size:36068
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cca
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cca/git_srcs job_size:36111
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cca/make_build_dir job_size:34695
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cca/config job_size:35430
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cca/install job_size:35292
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cca/install_log job_size:38662
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/cca/remove_write_perm job_size:35473
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ccb/var_summary job_size:36068
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ccb
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ccb/git_srcs job_size:36111
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ccb/make_build_dir job_size:34695
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ccb/config job_size:35430
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ccb/install job_size:35292
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ccb/install_log job_size:38662
-LOG:[12:55:58 13.4.2017]  submitted: /bufrdc_tables/ccb/remove_write_perm job_size:35473
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/regenerate job_size:15370
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/var_summary job_size:15515
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/git_srcs job_size:15558
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/make_build_dir job_size:14073
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/config job_size:15018
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/build job_size:14171
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/test job_size:15001
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/install job_size:14855
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/post_install job_size:14902
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/install_check job_size:16373
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/install_log job_size:18691
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/remove_write_perm job_size:14768
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/module_sync job_size:13712
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.49/wipe_build job_size:15312
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/var_summary job_size:15539
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/git_srcs job_size:15582
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/make_build_dir job_size:14097
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/config job_size:15042
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/build job_size:14195
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/test job_size:15025
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/install job_size:14879
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/post_install job_size:14926
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/install_check job_size:16397
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/install_log job_size:18715
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/remove_write_perm job_size:14792
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/module_sync job_size:13736
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxop_dev/gnu.53/wipe_build job_size:15336
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/var_summary job_size:36087
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/git_srcs job_size:36107
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/make_build_dir job_size:34728
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/config job_size:35515
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/build job_size:34620
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/test job_size:35428
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/install job_size:35322
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/post_install job_size:35474
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/install_check job_size:36967
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/install_log job_size:38957
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/remove_write_perm job_size:35453
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/module_sync job_size:34290
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.53/wipe_build job_size:35873
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/var_summary job_size:36087
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/git_srcs job_size:36107
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/make_build_dir job_size:34728
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/config job_size:35515
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/build job_size:34620
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/test job_size:35428
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/install job_size:35322
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/post_install job_size:35474
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/install_check job_size:36967
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/install_log job_size:38957
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/remove_write_perm job_size:35453
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/module_sync job_size:34290
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/gnu.62/wipe_build job_size:35873
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/var_summary job_size:36121
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/git_srcs job_size:36171
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/make_build_dir job_size:34766
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/config job_size:35549
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/build job_size:34650
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/test job_size:35458
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/install job_size:35354
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/post_install job_size:35504
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/install_check job_size:36999
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/install_log job_size:38993
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/remove_write_perm job_size:35483
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/module_sync job_size:34318
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/intel.17/wipe_build job_size:35907
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/var_summary job_size:36054
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/git_srcs job_size:36089
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/make_build_dir job_size:34697
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/config job_size:35482
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/build job_size:34585
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/test job_size:35393
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/install job_size:35288
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/post_install job_size:35439
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/install_check job_size:36933
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/install_log job_size:38925
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/remove_write_perm job_size:35418
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/module_sync job_size:34254
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cck/cray.85/wipe_build job_size:35840
-WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/var_summary job_size:36130
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/git_srcs job_size:36150
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/make_build_dir job_size:34771
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/config job_size:35577
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/build job_size:34663
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/test job_size:35471
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/install job_size:35365
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/post_install job_size:35517
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/install_check job_size:37010
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/install_log job_size:39000
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/remove_write_perm job_size:35496
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/module_sync job_size:34333
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.49/wipe_build job_size:35916
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/var_summary job_size:36130
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/git_srcs job_size:36150
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/make_build_dir job_size:34771
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/config job_size:35577
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/build job_size:34663
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/test job_size:35471
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/install job_size:35365
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/post_install job_size:35517
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/install_check job_size:37010
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/install_log job_size:39000
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/remove_write_perm job_size:35496
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/module_sync job_size:34333
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/gnu.53/wipe_build job_size:35916
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/var_summary job_size:36195
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/git_srcs job_size:36245
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/make_build_dir job_size:34840
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/config job_size:35662
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/build job_size:34724
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/test job_size:35532
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/install job_size:35428
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/post_install job_size:35578
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/install_check job_size:37073
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/install_log job_size:39067
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/remove_write_perm job_size:35557
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/module_sync job_size:34392
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.14/wipe_build job_size:35981
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/var_summary job_size:36195
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/git_srcs job_size:36245
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/make_build_dir job_size:34840
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/config job_size:35662
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/build job_size:34724
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/test job_size:35532
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/install job_size:35428
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/post_install job_size:35578
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/install_check job_size:37073
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/install_log job_size:39067
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/remove_write_perm job_size:35557
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/module_sync job_size:34392
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.15/wipe_build job_size:35981
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/var_summary job_size:36195
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/git_srcs job_size:36245
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/make_build_dir job_size:34840
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/config job_size:35662
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/build job_size:34724
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/test job_size:35532
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/install job_size:35428
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/post_install job_size:35578
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/install_check job_size:37073
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/install_log job_size:39067
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/remove_write_perm job_size:35557
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/module_sync job_size:34392
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/intel.16/wipe_build job_size:35981
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/var_summary job_size:36097
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/git_srcs job_size:36132
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/make_build_dir job_size:34740
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/config job_size:35632
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/build job_size:34628
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/test job_size:35436
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/install job_size:35331
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/post_install job_size:35482
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/install_check job_size:36976
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/install_log job_size:38968
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/remove_write_perm job_size:35461
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/module_sync job_size:34297
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.84/wipe_build job_size:35883
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/var_summary job_size:36097
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/git_srcs job_size:36132
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/make_build_dir job_size:34740
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/config job_size:35632
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/build job_size:34628
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/test job_size:35436
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/install job_size:35331
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/post_install job_size:35482
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/install_check job_size:36976
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/install_log job_size:38968
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/remove_write_perm job_size:35461
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/module_sync job_size:34297
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.85/wipe_build job_size:35883
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/var_summary job_size:36125
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/git_srcs job_size:36175
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/make_build_dir job_size:34770
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/config job_size:35660
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/build job_size:34654
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/test job_size:35462
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/install job_size:35358
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/post_install job_size:35508
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/install_check job_size:37003
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/install_log job_size:38997
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/remove_write_perm job_size:35487
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/module_sync job_size:34322
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cct/cray.846/wipe_build job_size:35911
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/var_summary job_size:15488
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/git_srcs job_size:15273
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/make_build_dir job_size:13996
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/config job_size:14907
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/build job_size:14158
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/test job_size:14988
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/install job_size:14785
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/post_install job_size:14851
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/install_check job_size:16321
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/install_log job_size:18197
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/remove_write_perm job_size:14714
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/module_sync job_size:13716
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappa/wipe_build job_size:15274
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/var_summary job_size:15474
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/git_srcs job_size:15403
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/make_build_dir job_size:14009
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/config job_size:14943
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/build job_size:14135
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/test job_size:14965
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/install job_size:14812
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/post_install job_size:14866
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/install_check job_size:16337
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/install_log job_size:18643
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/remove_write_perm job_size:14732
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/module_sync job_size:13683
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.44/wipe_build job_size:15257
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/var_summary job_size:15450
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/git_srcs job_size:15379
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/make_build_dir job_size:13985
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/config job_size:14919
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/build job_size:14111
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/test job_size:14941
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/install job_size:14788
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/post_install job_size:14842
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/install_check job_size:16313
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/install_log job_size:18619
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/remove_write_perm job_size:14708
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/module_sync job_size:13659
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ecgb/gnu.53/wipe_build job_size:15233
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/var_summary job_size:15430
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/git_srcs job_size:15290
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/make_build_dir job_size:13948
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/config job_size:14890
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/build job_size:14090
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/test job_size:14920
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/install job_size:14763
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/post_install job_size:14818
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/install_check job_size:16289
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/install_log job_size:18595
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/remove_write_perm job_size:14687
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/module_sync job_size:13641
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/gnu.53/wipe_build job_size:15207
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/var_summary job_size:15490
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/git_srcs job_size:15380
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/make_build_dir job_size:14012
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/config job_size:14950
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/build job_size:14146
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/test job_size:14976
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/install job_size:14821
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/post_install job_size:14874
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/install_check job_size:16347
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/install_log job_size:18657
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/remove_write_perm job_size:14743
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/module_sync job_size:13695
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/intel.16/wipe_build job_size:15267
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/var_summary job_size:15468
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/git_srcs job_size:15328
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/make_build_dir job_size:13986
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/config job_size:14965
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/build job_size:14128
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/test job_size:14958
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/install job_size:14801
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/post_install job_size:14856
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/install_check job_size:16327
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/install_log job_size:18633
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/remove_write_perm job_size:14725
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/module_sync job_size:13679
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxg/pgi.16/wipe_build job_size:15245
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/var_summary job_size:15514
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/git_srcs job_size:15476
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/make_build_dir job_size:14043
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/config job_size:14987
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/build job_size:14157
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/test job_size:14987
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/install job_size:14837
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/post_install job_size:14909
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/install_check job_size:16380
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/install_log job_size:18686
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/remove_write_perm job_size:14754
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/module_sync job_size:13709
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.48/wipe_build job_size:15289
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/var_summary job_size:15538
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/git_srcs job_size:15500
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/make_build_dir job_size:14067
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/config job_size:15011
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/build job_size:14181
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/test job_size:15011
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/install job_size:14861
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/post_install job_size:14933
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/install_check job_size:16404
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/install_log job_size:18710
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/remove_write_perm job_size:14778
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/module_sync job_size:13733
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.53/wipe_build job_size:15313
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/var_summary job_size:15538
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/git_srcs job_size:15500
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/make_build_dir job_size:14067
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/config job_size:15011
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/build job_size:14181
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/test job_size:15011
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/install job_size:14861
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/post_install job_size:14933
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/install_check job_size:16404
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/install_log job_size:18710
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/remove_write_perm job_size:14778
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/module_sync job_size:13733
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/gnu.61/wipe_build job_size:15313
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/var_summary job_size:15540
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/git_srcs job_size:15457
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/make_build_dir job_size:14063
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/config job_size:15050
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/build job_size:14189
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/test job_size:15019
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/install job_size:14866
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/post_install job_size:14941
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/install_check job_size:16409
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/install_log job_size:18709
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/remove_write_perm job_size:14786
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/module_sync job_size:13744
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/opensuse131/pgi/wipe_build job_size:15315
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/var_summary job_size:15431
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/git_srcs job_size:15291
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/make_build_dir job_size:13949
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/config job_size:14891
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/build job_size:14091
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/test job_size:14921
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/install job_size:14764
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/post_install job_size:14819
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/install_check job_size:16290
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/install_log job_size:18596
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/remove_write_perm job_size:14688
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/module_sync job_size:13642
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.49/wipe_build job_size:15208
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/var_summary job_size:15455
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/git_srcs job_size:15315
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/make_build_dir job_size:13973
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/config job_size:14915
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/build job_size:14115
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/test job_size:14945
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/install job_size:14788
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/post_install job_size:14843
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/install_check job_size:16314
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/install_log job_size:18620
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/remove_write_perm job_size:14712
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/module_sync job_size:13666
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/gnu.53/wipe_build job_size:15232
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/var_summary job_size:15439
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/git_srcs job_size:15254
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/make_build_dir job_size:13951
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/config job_size:14936
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/build job_size:14105
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/test job_size:14935
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/install job_size:14775
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/post_install job_size:14833
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/install_check job_size:16301
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/install_log job_size:18601
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/remove_write_perm job_size:14702
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/module_sync job_size:13659
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/lxc/pgi/wipe_build job_size:15216
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/var_summary job_size:15464
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/git_srcs job_size:15351
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/make_build_dir job_size:13983
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/config job_size:14937
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/build job_size:14117
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/test job_size:14947
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/install job_size:14792
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/post_install job_size:14854
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/install_check job_size:16325
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/install_log job_size:18631
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/remove_write_perm job_size:14714
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/module_sync job_size:13669
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.53/wipe_build job_size:15239
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/var_summary job_size:15488
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/git_srcs job_size:15375
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/make_build_dir job_size:14007
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/config job_size:14961
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/build job_size:14141
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/test job_size:14971
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/install job_size:14816
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/post_install job_size:14878
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/install_check job_size:16349
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/install_log job_size:18655
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/remove_write_perm job_size:14738
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/module_sync job_size:13693
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/gnu.61/wipe_build job_size:15263
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/var_summary job_size:15490
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/git_srcs job_size:15332
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/make_build_dir job_size:14003
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/config job_size:15000
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/build job_size:14149
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/test job_size:14979
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/install job_size:14821
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/post_install job_size:14886
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/install_check job_size:16354
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/install_log job_size:18654
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/remove_write_perm job_size:14746
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/module_sync job_size:13704
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/leap42/pgi/wipe_build job_size:15265
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/var_summary job_size:15488
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/git_srcs job_size:15273
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/make_build_dir job_size:13996
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/config job_size:14907
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/build job_size:14158
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/test job_size:14988
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/install job_size:14785
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/post_install job_size:14851
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/install_check job_size:16321
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/install_log job_size:18197
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/remove_write_perm job_size:14714
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/module_sync job_size:13716
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/sappb/wipe_build job_size:15274
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/var_summary job_size:36130
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/git_srcs job_size:36150
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/make_build_dir job_size:34771
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/config job_size:35577
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/build job_size:34663
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/test job_size:35471
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/install job_size:35365
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/post_install job_size:35517
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/install_check job_size:37010
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/install_log job_size:39000
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/remove_write_perm job_size:35496
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/module_sync job_size:34333
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.49/wipe_build job_size:35916
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/var_summary job_size:36130
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/git_srcs job_size:36150
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/make_build_dir job_size:34771
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/config job_size:35577
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/build job_size:34663
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/test job_size:35471
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/install job_size:35365
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/post_install job_size:35517
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/install_check job_size:37010
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/install_log job_size:39000
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/remove_write_perm job_size:35496
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/module_sync job_size:34333
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/gnu.53/wipe_build job_size:35916
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/var_summary job_size:36195
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/git_srcs job_size:36245
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/make_build_dir job_size:34840
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/config job_size:35662
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/build job_size:34724
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/test job_size:35532
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/install job_size:35428
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/post_install job_size:35578
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/install_check job_size:37073
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/install_log job_size:39067
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/remove_write_perm job_size:35557
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/module_sync job_size:34392
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.14/wipe_build job_size:35981
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/var_summary job_size:36195
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/git_srcs job_size:36245
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/make_build_dir job_size:34840
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/config job_size:35662
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/build job_size:34724
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/test job_size:35532
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/install job_size:35428
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/post_install job_size:35578
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/install_check job_size:37073
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/install_log job_size:39067
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/remove_write_perm job_size:35557
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/module_sync job_size:34392
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.15/wipe_build job_size:35981
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/var_summary job_size:36171
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/git_srcs job_size:36221
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/make_build_dir job_size:34816
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/config job_size:35638
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/build job_size:34700
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/test job_size:35508
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/install job_size:35404
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/post_install job_size:35554
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/install_check job_size:37049
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/install_log job_size:39043
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/remove_write_perm job_size:35533
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/module_sync job_size:34368
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/intel.16/wipe_build job_size:35957
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/var_summary job_size:36097
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/git_srcs job_size:36132
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/make_build_dir job_size:34740
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/config job_size:35632
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/build job_size:34628
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/test job_size:35436
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/install job_size:35331
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/post_install job_size:35482
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/install_check job_size:36976
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/install_log job_size:38968
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/remove_write_perm job_size:35461
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/module_sync job_size:34297
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.84/wipe_build job_size:35883
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/var_summary job_size:36125
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/git_srcs job_size:36175
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/make_build_dir job_size:34770
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/config job_size:35660
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/build job_size:34654
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/test job_size:35462
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/install job_size:35358
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/post_install job_size:35508
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/install_check job_size:37003
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/install_log job_size:38997
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/remove_write_perm job_size:35487
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/module_sync job_size:34322
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/cca/cray.846/wipe_build job_size:35911
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/var_summary job_size:36130
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/git_srcs job_size:36150
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/make_build_dir job_size:34771
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/config job_size:35577
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/build job_size:34663
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/test job_size:35471
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/install job_size:35365
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/post_install job_size:35517
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/install_check job_size:37010
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/install_log job_size:39000
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/remove_write_perm job_size:35496
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/module_sync job_size:34333
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.49/wipe_build job_size:35916
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/var_summary job_size:36130
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/git_srcs job_size:36150
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/make_build_dir job_size:34771
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/config job_size:35577
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/build job_size:34663
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/test job_size:35471
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/install job_size:35365
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/post_install job_size:35517
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/install_check job_size:37010
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/install_log job_size:39000
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/remove_write_perm job_size:35496
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/module_sync job_size:34333
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/gnu.53/wipe_build job_size:35916
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/var_summary job_size:36195
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/git_srcs job_size:36245
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/make_build_dir job_size:34840
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/config job_size:35662
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/build job_size:34724
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/test job_size:35532
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/install job_size:35428
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/post_install job_size:35578
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/install_check job_size:37073
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/install_log job_size:39067
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/remove_write_perm job_size:35557
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/module_sync job_size:34392
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.14/wipe_build job_size:35981
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/var_summary job_size:36195
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/git_srcs job_size:36245
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/make_build_dir job_size:34840
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/config job_size:35662
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/build job_size:34724
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/test job_size:35532
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/install job_size:35428
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/post_install job_size:35578
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/install_check job_size:37073
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/install_log job_size:39067
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/remove_write_perm job_size:35557
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/module_sync job_size:34392
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.15/wipe_build job_size:35981
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/var_summary job_size:36171
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/git_srcs job_size:36221
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/make_build_dir job_size:34816
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/config job_size:35638
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/build job_size:34700
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/test job_size:35508
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/install job_size:35404
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/post_install job_size:35554
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/install_check job_size:37049
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/install_log job_size:39043
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/remove_write_perm job_size:35533
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/module_sync job_size:34368
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/intel.16/wipe_build job_size:35957
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/var_summary job_size:36097
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/git_srcs job_size:36132
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/make_build_dir job_size:34740
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/config job_size:35632
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/build job_size:34628
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/test job_size:35436
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/install job_size:35331
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/post_install job_size:35482
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/install_check job_size:36976
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/install_log job_size:38968
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/remove_write_perm job_size:35461
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/module_sync job_size:34297
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.84/wipe_build job_size:35883
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/var_summary job_size:36125
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/git_srcs job_size:36175
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/make_build_dir job_size:34770
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/config job_size:35660
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/build job_size:34654
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/test job_size:35462
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/install job_size:35358
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/post_install job_size:35508
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/install_check job_size:37003
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/install_log job_size:38997
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/remove_write_perm job_size:35487
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/module_sync job_size:34322
-LOG:[12:55:58 13.4.2017]  submitted: /grib_api/ccb/cray.846/wipe_build job_size:35911
-WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/regenerate job_size:15649
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/var_summary job_size:15755
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/git_srcs job_size:15896
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/make_build_dir job_size:14297
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/config job_size:15239
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/build job_size:14391
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/install job_size:15049
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/tests/archive job_size:15760
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/tests/bad_archive job_size:16429
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/tests/environment job_size:16364
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/install_log job_size:18499
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/remove_write_perm job_size:14963
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxop_dev/wipe_build job_size:15533
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/var_summary job_size:36374
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/git_srcs job_size:36492
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/make_build_dir job_size:34999
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/config job_size:35741
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/build job_size:34887
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/install job_size:35591
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/tests/archive job_size:36404
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/tests/bad_archive job_size:37161
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/tests/environment job_size:37096
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/install_log job_size:39120
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/remove_write_perm job_size:35723
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cck/wipe_build job_size:36148
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/var_summary job_size:36452
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/git_srcs job_size:36570
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/make_build_dir job_size:35077
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/config job_size:35834
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/build job_size:34965
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/install job_size:35669
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/tests/archive job_size:36482
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/tests/bad_archive job_size:37239
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/tests/environment job_size:37174
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/install_log job_size:39198
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/remove_write_perm job_size:35801
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cct/wipe_build job_size:36226
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/var_summary job_size:15694
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/git_srcs job_size:15721
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/make_build_dir job_size:14213
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/config job_size:15074
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/build job_size:14335
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/install job_size:14986
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/tests/archive job_size:15704
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/tests/bad_archive job_size:16373
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/tests/environment job_size:16308
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/install_log job_size:18431
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/remove_write_perm job_size:14907
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ecgb/wipe_build job_size:15458
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/var_summary job_size:15692
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/git_srcs job_size:15650
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/make_build_dir job_size:14194
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/config job_size:15133
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/build job_size:14332
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/install job_size:14979
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/tests/archive job_size:15701
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/tests/bad_archive job_size:16370
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/tests/environment job_size:16305
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/install_log job_size:18425
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/remove_write_perm job_size:14904
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxg/wipe_build job_size:15450
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/var_summary job_size:15739
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/git_srcs job_size:15799
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/make_build_dir job_size:14252
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/config job_size:15107
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/build job_size:14362
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/install job_size:15016
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/tests/archive job_size:15731
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/tests/bad_archive job_size:16400
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/tests/environment job_size:16335
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/install_log job_size:18479
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/remove_write_perm job_size:14934
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/opensuse131/wipe_build job_size:15495
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/var_summary job_size:15674
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/git_srcs job_size:15632
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/make_build_dir job_size:14176
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/config job_size:15115
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/build job_size:14314
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/install job_size:14961
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/tests/archive job_size:15683
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/tests/bad_archive job_size:16352
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/tests/environment job_size:16287
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/install_log job_size:18407
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/remove_write_perm job_size:14886
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/lxc/wipe_build job_size:15432
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/var_summary job_size:15684
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/git_srcs job_size:15669
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/make_build_dir job_size:14187
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/config job_size:15052
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/build job_size:14317
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/install job_size:14966
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/tests/archive job_size:15686
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/tests/bad_archive job_size:16355
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/tests/environment job_size:16290
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/install_log job_size:18419
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/remove_write_perm job_size:14889
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/leap42/wipe_build job_size:15440
-WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/var_summary job_size:36452
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/git_srcs job_size:36570
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/make_build_dir job_size:35077
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/config job_size:35834
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/build job_size:34965
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/install job_size:35669
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/tests/archive job_size:36482
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/tests/bad_archive job_size:37239
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/tests/environment job_size:37174
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/install_log job_size:39198
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/remove_write_perm job_size:35801
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/cca/wipe_build job_size:36226
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/var_summary job_size:36452
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/git_srcs job_size:36570
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/make_build_dir job_size:35077
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/config job_size:35834
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/build job_size:34965
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/install job_size:35669
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/tests/archive job_size:36482
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/tests
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/tests/bad_archive job_size:37239
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/tests/environment job_size:37174
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/install_log job_size:39198
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/remove_write_perm job_size:35801
-LOG:[12:55:58 13.4.2017]  submitted: /mars_client_mir/ccb/wipe_build job_size:36226
-LOG:[12:55:58 13.4.2017]  submitted: /boost/regenerate job_size:15315
-LOG:[12:55:58 13.4.2017]  submitted: /boost
-LOG:[12:55:58 13.4.2017]  submitted: /boost/localhost/gnu.53/var_summary job_size:15494
-LOG:[12:55:58 13.4.2017]  submitted: /boost/localhost/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /boost/localhost
-LOG:[12:55:58 13.4.2017]  submitted: /boost/localhost/gnu.53/download job_size:14399
-LOG:[12:55:58 13.4.2017]  submitted: /boost/localhost/gnu.53/copy_and_untar job_size:14632
-LOG:[12:55:58 13.4.2017]  submitted: /boost/localhost/gnu.53/clean_build_dir job_size:13900
-LOG:[12:55:58 13.4.2017]  submitted: /boost/localhost/gnu.53/build job_size:19237
-LOG:[12:55:58 13.4.2017]  submitted: /boost/localhost/gnu.53/remove_source_dir job_size:13844
-WAR:[12:55:58 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/regenerate job_size:15353
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/var_summary job_size:15607
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/git_srcs job_size:15626
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/make_build_dir job_size:14166
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/config job_size:15259
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/build job_size:14268
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/test job_size:15067
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/add_write_perm job_size:14829
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/install job_size:14953
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/install_log job_size:18776
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/remove_write_perm job_size:14868
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/module_sync job_size:13809
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.49/wipe_build job_size:15407
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/var_summary job_size:15631
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/git_srcs job_size:15650
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/make_build_dir job_size:14190
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/config job_size:15283
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/build job_size:14292
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/test job_size:15091
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/add_write_perm job_size:14853
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/install job_size:14977
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/install_log job_size:18800
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/remove_write_perm job_size:14892
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/module_sync job_size:13833
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/lxop_dev/gnu.53/wipe_build job_size:15431
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/var_summary job_size:36103
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/git_srcs job_size:36099
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/make_build_dir job_size:34745
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/config job_size:35570
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/build job_size:34641
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/test job_size:35418
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/add_write_perm job_size:35372
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/install job_size:35344
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/install_log job_size:38966
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/remove_write_perm job_size:35477
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/module_sync job_size:34311
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.53/wipe_build job_size:35891
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.62/var_summary job_size:36103
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.62
-LOG:[12:55:58 13.4.2017]  submitted: /odb_api/cck/gnu.62/git_srcs job_size:36099
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/make_build_dir job_size:34745
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/config job_size:35570
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/build job_size:34641
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/test job_size:35418
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/add_write_perm job_size:35372
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/install job_size:35344
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/install_log job_size:38966
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/remove_write_perm job_size:35477
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/module_sync job_size:34311
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/gnu.62/wipe_build job_size:35891
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/var_summary job_size:36137
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/git_srcs job_size:36163
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/make_build_dir job_size:34783
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/config job_size:35604
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/build job_size:34671
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/test job_size:35448
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/add_write_perm job_size:35402
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/install job_size:35376
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/install_log job_size:39002
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/remove_write_perm job_size:35507
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/module_sync job_size:34339
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/intel.17/wipe_build job_size:35925
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/var_summary job_size:36070
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/git_srcs job_size:36081
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/make_build_dir job_size:34714
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/config job_size:35618
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/build job_size:34606
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/test job_size:35383
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/add_write_perm job_size:35337
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/install job_size:35310
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/install_log job_size:38934
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/remove_write_perm job_size:35442
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/module_sync job_size:34275
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cck/cray.85/wipe_build job_size:35858
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/var_summary job_size:36164
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/git_srcs job_size:36160
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/make_build_dir job_size:34806
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/config job_size:35698
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/build job_size:34702
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/test job_size:35479
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/add_write_perm job_size:35433
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/install job_size:35405
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/install_log job_size:39027
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/remove_write_perm job_size:35538
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/module_sync job_size:34372
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.49/wipe_build job_size:35952
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/var_summary job_size:36164
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/git_srcs job_size:36160
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/make_build_dir job_size:34806
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/config job_size:35698
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/build job_size:34702
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/test job_size:35479
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/add_write_perm job_size:35433
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/install job_size:35405
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/install_log job_size:39027
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/remove_write_perm job_size:35538
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/module_sync job_size:34372
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/gnu.53/wipe_build job_size:35952
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/var_summary job_size:36229
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/git_srcs job_size:36255
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/make_build_dir job_size:34875
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/config job_size:35736
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/build job_size:34763
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/test job_size:35540
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/add_write_perm job_size:35494
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/install job_size:35468
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/install_log job_size:39094
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/remove_write_perm job_size:35599
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/module_sync job_size:34431
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.14/wipe_build job_size:36017
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/var_summary job_size:36229
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/git_srcs job_size:36255
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/make_build_dir job_size:34875
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/config job_size:35736
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/build job_size:34763
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/test job_size:35540
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/add_write_perm job_size:35494
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/install job_size:35468
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/install_log job_size:39094
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/remove_write_perm job_size:35599
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/module_sync job_size:34431
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.15/wipe_build job_size:36017
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/var_summary job_size:36229
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/git_srcs job_size:36255
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/make_build_dir job_size:34875
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/config job_size:35736
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/build job_size:34763
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/test job_size:35540
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/add_write_perm job_size:35494
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/install job_size:35468
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/install_log job_size:39094
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/remove_write_perm job_size:35599
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/module_sync job_size:34431
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/intel.16/wipe_build job_size:36017
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/var_summary job_size:36213
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/git_srcs job_size:36224
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/make_build_dir job_size:34857
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/config job_size:35802
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/build job_size:34749
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/test job_size:35526
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/add_write_perm job_size:35480
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/install job_size:35453
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/install_log job_size:39077
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/remove_write_perm job_size:35585
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/module_sync job_size:34418
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.84/wipe_build job_size:36001
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/var_summary job_size:36213
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/git_srcs job_size:36224
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/make_build_dir job_size:34857
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/config job_size:35802
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/build job_size:34749
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/test job_size:35526
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/add_write_perm job_size:35480
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/install job_size:35453
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/install_log job_size:39077
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/remove_write_perm job_size:35585
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/module_sync job_size:34418
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.85/wipe_build job_size:36001
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/var_summary job_size:36241
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/git_srcs job_size:36267
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/make_build_dir job_size:34887
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/config job_size:35830
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/build job_size:34775
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/test job_size:35552
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/add_write_perm job_size:35506
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/install job_size:35480
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/install_log job_size:39106
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/remove_write_perm job_size:35611
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/module_sync job_size:34443
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cct/cray.846/wipe_build job_size:36029
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/var_summary job_size:15469
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/git_srcs job_size:15230
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/make_build_dir job_size:13978
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/config job_size:14968
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/build job_size:14144
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/test job_size:14943
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/add_write_perm job_size:14664
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/install job_size:14772
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/install_log job_size:18171
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/remove_write_perm job_size:14703
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/module_sync job_size:13702
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappa/wipe_build job_size:15257
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/var_summary job_size:15572
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/git_srcs job_size:15477
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/make_build_dir job_size:14108
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/config job_size:15122
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/build job_size:14238
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/test job_size:15037
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/add_write_perm job_size:14799
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/install job_size:14916
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/install_log job_size:18734
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/remove_write_perm job_size:14838
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/module_sync job_size:13786
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.44/wipe_build job_size:15358
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/var_summary job_size:15542
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/git_srcs job_size:15447
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/make_build_dir job_size:14078
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/config job_size:15092
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/build job_size:14208
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/test job_size:15007
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/add_write_perm job_size:14769
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/install job_size:14886
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/install_log job_size:18704
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/remove_write_perm job_size:14808
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/module_sync job_size:13756
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ecgb/gnu.53/wipe_build job_size:15328
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/var_summary job_size:15528
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/git_srcs job_size:15364
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/make_build_dir job_size:14047
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/config job_size:15067
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/build job_size:14193
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/test job_size:14992
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/add_write_perm job_size:14754
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/install job_size:14867
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/install_log job_size:18686
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/remove_write_perm job_size:14793
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/module_sync job_size:13744
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/gnu.53/wipe_build job_size:15308
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/var_summary job_size:15588
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/git_srcs job_size:15454
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/make_build_dir job_size:14111
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/config job_size:15128
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/build job_size:14249
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/test job_size:15048
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/add_write_perm job_size:14810
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/install job_size:14925
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/install_log job_size:18748
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/remove_write_perm job_size:14849
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/module_sync job_size:13798
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxg/intel.16/wipe_build job_size:15368
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/var_summary job_size:15612
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/git_srcs job_size:15550
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/make_build_dir job_size:14142
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/config job_size:15228
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/build job_size:14260
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/test job_size:15059
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/add_write_perm job_size:14821
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/install job_size:14941
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/install_log job_size:18777
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/remove_write_perm job_size:14860
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/module_sync job_size:13812
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.48/wipe_build job_size:15390
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/var_summary job_size:15636
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/git_srcs job_size:15574
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/make_build_dir job_size:14166
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/config job_size:15195
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/build job_size:14284
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/test job_size:15083
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/add_write_perm job_size:14845
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/install job_size:14965
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/install_log job_size:18801
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/remove_write_perm job_size:14884
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/module_sync job_size:13836
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.53/wipe_build job_size:15414
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/var_summary job_size:15612
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/git_srcs job_size:15550
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/make_build_dir job_size:14142
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/config job_size:15149
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/build job_size:14260
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/test job_size:15059
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/add_write_perm job_size:14821
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/install job_size:14941
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/install_log job_size:18777
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/remove_write_perm job_size:14860
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/module_sync job_size:13812
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/opensuse131/gnu.61/wipe_build job_size:15390
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/var_summary job_size:15529
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/git_srcs job_size:15365
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/make_build_dir job_size:14048
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/config job_size:15138
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/build job_size:14194
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/test job_size:14993
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/add_write_perm job_size:14755
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/install job_size:14868
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/install_log job_size:18687
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/remove_write_perm job_size:14794
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/module_sync job_size:13745
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.49/wipe_build job_size:15309
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/var_summary job_size:15553
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/git_srcs job_size:15389
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/make_build_dir job_size:14072
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/config job_size:15162
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/build job_size:14218
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/test job_size:15017
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/add_write_perm job_size:14779
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/install job_size:14892
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/install_log job_size:18711
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/remove_write_perm job_size:14818
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/module_sync job_size:13769
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/lxc/gnu.53/wipe_build job_size:15333
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/var_summary job_size:15562
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/git_srcs job_size:15425
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/make_build_dir job_size:14082
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/config job_size:15121
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/build job_size:14220
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/test job_size:15019
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/add_write_perm job_size:14781
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/install job_size:14896
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/install_log job_size:18722
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/remove_write_perm job_size:14820
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/module_sync job_size:13772
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.53/wipe_build job_size:15340
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/var_summary job_size:15586
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/git_srcs job_size:15449
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/make_build_dir job_size:14106
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/config job_size:15145
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/build job_size:14244
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/test job_size:15043
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/add_write_perm job_size:14805
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/install job_size:14920
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/install_log job_size:18746
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/remove_write_perm job_size:14844
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/module_sync job_size:13796
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/leap42/gnu.61/wipe_build job_size:15364
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/var_summary job_size:15469
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/git_srcs job_size:15230
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/make_build_dir job_size:13978
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/config job_size:14968
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/build job_size:14144
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/test job_size:14943
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/add_write_perm job_size:14664
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/install job_size:14772
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/install_log job_size:18171
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/remove_write_perm job_size:14703
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/module_sync job_size:13702
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/sappb/wipe_build job_size:15257
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/var_summary job_size:36164
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/git_srcs job_size:36160
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/make_build_dir job_size:34806
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/config job_size:35698
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/build job_size:34702
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/test job_size:35479
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/add_write_perm job_size:35433
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/install job_size:35405
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/install_log job_size:39027
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/remove_write_perm job_size:35538
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/module_sync job_size:34372
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.49/wipe_build job_size:35952
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/var_summary job_size:36164
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/git_srcs job_size:36160
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/make_build_dir job_size:34806
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/config job_size:35698
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/build job_size:34702
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/test job_size:35479
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/add_write_perm job_size:35433
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/install job_size:35405
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/install_log job_size:39027
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/remove_write_perm job_size:35538
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/module_sync job_size:34372
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/gnu.53/wipe_build job_size:35952
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/var_summary job_size:36229
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/git_srcs job_size:36255
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/make_build_dir job_size:34875
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/config job_size:35736
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/build job_size:34763
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/test job_size:35540
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/add_write_perm job_size:35494
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/install job_size:35468
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/install_log job_size:39094
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/remove_write_perm job_size:35599
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/module_sync job_size:34431
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.14/wipe_build job_size:36017
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/var_summary job_size:36229
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/git_srcs job_size:36255
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/make_build_dir job_size:34875
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/config job_size:35736
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/build job_size:34763
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/test job_size:35540
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/add_write_perm job_size:35494
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/install job_size:35468
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/install_log job_size:39094
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/remove_write_perm job_size:35599
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/module_sync job_size:34431
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.15/wipe_build job_size:36017
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/var_summary job_size:36205
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/git_srcs job_size:36231
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/make_build_dir job_size:34851
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/config job_size:35712
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/build job_size:34739
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/test job_size:35516
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/add_write_perm job_size:35470
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/install job_size:35444
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/install_log job_size:39070
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/remove_write_perm job_size:35575
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/module_sync job_size:34407
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/intel.16/wipe_build job_size:35993
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/var_summary job_size:36213
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/git_srcs job_size:36224
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/make_build_dir job_size:34857
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/config job_size:35802
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/build job_size:34749
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/test job_size:35526
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/add_write_perm job_size:35480
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/install job_size:35453
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/install_log job_size:39077
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/remove_write_perm job_size:35585
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/module_sync job_size:34418
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.84/wipe_build job_size:36001
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/var_summary job_size:36241
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/git_srcs job_size:36267
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/make_build_dir job_size:34887
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/config job_size:35830
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/build job_size:34775
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/test job_size:35552
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/add_write_perm job_size:35506
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/install job_size:35480
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/install_log job_size:39106
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/remove_write_perm job_size:35611
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/module_sync job_size:34443
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/cca/cray.846/wipe_build job_size:36029
-WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/var_summary job_size:36164
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/git_srcs job_size:36160
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/make_build_dir job_size:34806
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/config job_size:35698
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/build job_size:34702
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/test job_size:35479
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/add_write_perm job_size:35433
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/install job_size:35405
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/install_log job_size:39027
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/remove_write_perm job_size:35538
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/module_sync job_size:34372
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.49/wipe_build job_size:35952
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/var_summary job_size:36164
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/git_srcs job_size:36160
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/make_build_dir job_size:34806
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/config job_size:35698
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/build job_size:34702
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/test job_size:35479
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/add_write_perm job_size:35433
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/install job_size:35405
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/install_log job_size:39027
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/remove_write_perm job_size:35538
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/module_sync job_size:34372
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/gnu.53/wipe_build job_size:35952
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/var_summary job_size:36229
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/git_srcs job_size:36255
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/make_build_dir job_size:34875
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/config job_size:35736
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/build job_size:34763
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/test job_size:35540
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/add_write_perm job_size:35494
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/install job_size:35468
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/install_log job_size:39094
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/remove_write_perm job_size:35599
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/module_sync job_size:34431
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.14/wipe_build job_size:36017
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/var_summary job_size:36229
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/git_srcs job_size:36255
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/make_build_dir job_size:34875
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/config job_size:35736
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/build job_size:34763
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/test job_size:35540
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/add_write_perm job_size:35494
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/install job_size:35468
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/install_log job_size:39094
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/remove_write_perm job_size:35599
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/module_sync job_size:34431
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.15/wipe_build job_size:36017
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/var_summary job_size:36205
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/git_srcs job_size:36231
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/make_build_dir job_size:34851
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/config job_size:35712
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/build job_size:34739
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/test job_size:35516
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/add_write_perm job_size:35470
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/install job_size:35444
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/install_log job_size:39070
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/remove_write_perm job_size:35575
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/module_sync job_size:34407
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/intel.16/wipe_build job_size:35993
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/var_summary job_size:36213
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/git_srcs job_size:36224
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/make_build_dir job_size:34857
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/config job_size:35802
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/build job_size:34749
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/test job_size:35526
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/add_write_perm job_size:35480
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/install job_size:35453
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/install_log job_size:39077
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/remove_write_perm job_size:35585
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/module_sync job_size:34418
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.84/wipe_build job_size:36001
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/var_summary job_size:36241
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/git_srcs job_size:36267
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/make_build_dir job_size:34887
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/config job_size:35830
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/build job_size:34775
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/test job_size:35552
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/add_write_perm job_size:35506
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/install job_size:35480
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/install_log job_size:39106
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/remove_write_perm job_size:35611
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/module_sync job_size:34443
-LOG:[12:55:59 13.4.2017]  submitted: /odb_api/ccb/cray.846/wipe_build job_size:36029
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/regenerate job_size:15277
-LOG:[12:55:59 13.4.2017]  submitted: /ifs
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/var_summary job_size:35869
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/git_srcs job_size:35841
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/make_build_dir job_size:34515
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/config job_size:35271
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/build job_size:34427
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/test job_size:35235
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/add_write_perm job_size:35146
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/install job_size:35114
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/install_log job_size:38680
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/remove_write_perm job_size:35251
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/module_sync job_size:34097
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.53/wipe_build job_size:35665
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/var_summary job_size:35869
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/git_srcs job_size:35841
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/make_build_dir job_size:34515
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/config job_size:35271
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/build job_size:34427
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/test job_size:35235
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/add_write_perm job_size:35146
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/install job_size:35114
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/install_log job_size:38680
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/remove_write_perm job_size:35251
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/module_sync job_size:34097
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/gnu.62/wipe_build job_size:35665
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/var_summary job_size:35903
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/git_srcs job_size:35905
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/make_build_dir job_size:34553
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/config job_size:35307
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/build job_size:34457
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/test job_size:35265
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/add_write_perm job_size:35176
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/install job_size:35146
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/install_log job_size:38716
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/remove_write_perm job_size:35281
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/module_sync job_size:34125
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/intel.17/wipe_build job_size:35699
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/var_summary job_size:35836
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/git_srcs job_size:35823
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/make_build_dir job_size:34484
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/config job_size:35239
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/build job_size:34392
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/test job_size:35200
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/add_write_perm job_size:35111
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/install job_size:35080
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/install_log job_size:38648
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/remove_write_perm job_size:35216
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/module_sync job_size:34061
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cck/cray.85/wipe_build job_size:35632
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/var_summary job_size:35996
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/git_srcs job_size:35968
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/make_build_dir job_size:34642
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/config job_size:35398
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/build job_size:34554
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/test job_size:35362
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/add_write_perm job_size:35273
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/install job_size:35241
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/install_log job_size:38807
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/remove_write_perm job_size:35378
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/module_sync job_size:34224
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.49/wipe_build job_size:35792
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/var_summary job_size:35996
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/git_srcs job_size:35968
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/make_build_dir job_size:34642
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/config job_size:35398
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/build job_size:34554
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/test job_size:35362
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/add_write_perm job_size:35273
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/install job_size:35241
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/install_log job_size:38807
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/remove_write_perm job_size:35378
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/module_sync job_size:34224
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/gnu.53/wipe_build job_size:35792
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/var_summary job_size:36061
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/git_srcs job_size:36063
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/make_build_dir job_size:34711
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/config job_size:35465
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/build job_size:34615
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/test job_size:35423
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/add_write_perm job_size:35334
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/install job_size:35304
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/install_log job_size:38874
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/remove_write_perm job_size:35439
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/module_sync job_size:34283
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.14/wipe_build job_size:35857
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/var_summary job_size:36061
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/git_srcs job_size:36063
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/make_build_dir job_size:34711
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/config job_size:35465
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/build job_size:34615
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/test job_size:35423
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/add_write_perm job_size:35334
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/install job_size:35304
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/install_log job_size:38874
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/remove_write_perm job_size:35439
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/module_sync job_size:34283
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.15/wipe_build job_size:35857
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/var_summary job_size:36061
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/git_srcs job_size:36063
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/make_build_dir job_size:34711
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/config job_size:35465
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/build job_size:34615
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/test job_size:35423
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/add_write_perm job_size:35334
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/install job_size:35304
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/install_log job_size:38874
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/remove_write_perm job_size:35439
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/module_sync job_size:34283
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/intel.16/wipe_build job_size:35857
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/var_summary job_size:35963
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/git_srcs job_size:35950
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/make_build_dir job_size:34611
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/config job_size:35394
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/build job_size:34519
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/test job_size:35327
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/add_write_perm job_size:35238
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/install job_size:35207
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/install_log job_size:38775
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/remove_write_perm job_size:35343
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/module_sync job_size:34188
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.84/wipe_build job_size:35759
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/var_summary job_size:35963
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/git_srcs job_size:35950
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/make_build_dir job_size:34611
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/config job_size:35394
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/build job_size:34519
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/test job_size:35327
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/add_write_perm job_size:35238
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/install job_size:35207
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/install_log job_size:38775
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/remove_write_perm job_size:35343
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/module_sync job_size:34188
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.85/wipe_build job_size:35759
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/var_summary job_size:35991
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/git_srcs job_size:35993
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/make_build_dir job_size:34641
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/config job_size:35423
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/build job_size:34545
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/test job_size:35353
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/add_write_perm job_size:35264
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/install job_size:35234
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/install_log job_size:38804
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/remove_write_perm job_size:35369
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/module_sync job_size:34213
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/cct/cray.846/wipe_build job_size:35787
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/var_summary job_size:15385
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/git_srcs job_size:15197
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/make_build_dir job_size:13908
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/config job_size:14806
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/build job_size:14070
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/test job_size:14900
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/add_write_perm job_size:14619
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/install job_size:14728
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/install_log job_size:18491
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/remove_write_perm job_size:14658
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/module_sync job_size:13621
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/gnu.53/wipe_build job_size:15177
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/var_summary job_size:15445
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/git_srcs job_size:15287
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/make_build_dir job_size:13972
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/config job_size:14868
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/build job_size:14126
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/test job_size:14956
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/add_write_perm job_size:14675
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/install job_size:14786
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/install_log job_size:18553
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/remove_write_perm job_size:14714
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/module_sync job_size:13675
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/intel.16/wipe_build job_size:15237
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/var_summary job_size:15423
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/git_srcs job_size:15235
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/make_build_dir job_size:13946
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/config job_size:14844
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/build job_size:14108
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/test job_size:14938
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/add_write_perm job_size:14657
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/install job_size:14766
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/install_log job_size:18529
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/remove_write_perm job_size:14696
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/module_sync job_size:13659
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/lxg/pgi.16/wipe_build job_size:15215
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/var_summary job_size:15413
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/git_srcs job_size:15252
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/make_build_dir job_size:13937
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/config job_size:14833
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/build job_size:14091
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/test job_size:14921
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/add_write_perm job_size:14640
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/install job_size:14751
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/install_log job_size:18521
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/remove_write_perm job_size:14679
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/module_sync job_size:13643
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.53/wipe_build job_size:15203
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/var_summary job_size:15437
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/git_srcs job_size:15276
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/make_build_dir job_size:13961
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/config job_size:14857
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/build job_size:14115
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/test job_size:14945
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/add_write_perm job_size:14664
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/install job_size:14775
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/install_log job_size:18545
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/remove_write_perm job_size:14703
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/module_sync job_size:13667
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/gnu.61/wipe_build job_size:15227
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/var_summary job_size:15421
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/git_srcs job_size:15215
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/make_build_dir job_size:13939
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/config job_size:14838
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/build job_size:14105
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/test job_size:14935
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/add_write_perm job_size:14654
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/install job_size:14762
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/install_log job_size:18526
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/remove_write_perm job_size:14693
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/module_sync job_size:13660
-LOG:[12:55:59 13.4.2017]  submitted: /ifs/leap42/pgi/wipe_build job_size:15211
-WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/regenerate job_size:15334
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/test_local_actions/action1 job_size:13448
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/test_local_actions
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/var_summary job_size:15598
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/git_srcs job_size:15592
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/make_build_dir job_size:14144
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/config job_size:15336
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/build job_size:14250
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/test job_size:15956
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/tests/cppcheck job_size:13920
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/tests
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/install job_size:15487
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/install_log job_size:18497
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/remove_write_perm job_size:14820
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/uninstall job_size:14833
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu/wipe_build job_size:15384
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/var_summary job_size:15732
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/git_srcs job_size:15838
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/make_build_dir job_size:14286
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/config job_size:15590
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/build job_size:14360
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/test job_size:16075
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/tests/cppcheck job_size:14014
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/tests
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/install job_size:15621
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/install_log job_size:18719
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/remove_write_perm job_size:14938
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/uninstall job_size:14951
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.python3/wipe_build job_size:15510
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/var_summary job_size:15714
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/git_srcs job_size:15806
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/make_build_dir job_size:14267
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/config job_size:15453
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/build job_size:14345
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/test job_size:16058
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/tests/cppcheck job_size:14001
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/tests
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/install job_size:15603
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/install_log job_size:18690
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/remove_write_perm job_size:14922
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/uninstall job_size:14935
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.shared/wipe_build job_size:15493
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/var_summary job_size:15678
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/git_srcs job_size:15728
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/make_build_dir job_size:14228
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/config job_size:15456
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/build job_size:14318
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/test job_size:16028
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/tests/cppcheck job_size:13980
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/tests
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/install job_size:15567
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/install_log job_size:18621
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/remove_write_perm job_size:14892
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/uninstall job_size:14905
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/gnu.ssl/wipe_build job_size:15460
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/var_summary job_size:15633
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/git_srcs job_size:15655
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/make_build_dir job_size:14181
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/config job_size:15418
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/build job_size:14279
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/test job_size:15987
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/tests/cppcheck job_size:13945
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/tests
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/install job_size:15522
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/install_log job_size:18554
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/remove_write_perm job_size:14851
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/uninstall job_size:14864
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang/wipe_build job_size:15417
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/var_summary job_size:15665
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/git_srcs job_size:15687
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/make_build_dir job_size:14213
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/config job_size:15409
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/build job_size:14311
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/test job_size:16019
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/tests/cppcheck job_size:13977
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/tests
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/install job_size:15554
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/install_log job_size:18586
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/remove_write_perm job_size:14883
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/uninstall job_size:14896
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/intel/wipe_build job_size:15449
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang_static_analsyer/git_srcs job_size:16055
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang_static_analsyer
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang_static_analsyer/make_build_dir job_size:14373
-LOG:[12:55:59 13.4.2017]  submitted: /ecflow/localhost/clang_static_analsyer/static_analyser job_size:15769
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/regenerate job_size:15315
-LOG:[12:55:59 13.4.2017]  submitted: /atlas
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/var_summary job_size:15480
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/git_srcs job_size:15494
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/make_build_dir job_size:14041
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/config job_size:14972
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/build job_size:14151
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/test job_size:14981
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/install job_size:14829
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/install_log job_size:18623
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/remove_write_perm job_size:14745
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/module_sync job_size:13692
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.49/wipe_build job_size:15286
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/var_summary job_size:15504
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/git_srcs job_size:15518
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/make_build_dir job_size:14065
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/config job_size:14996
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/build job_size:14175
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/test job_size:15005
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/install job_size:14853
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/install_log job_size:18647
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/remove_write_perm job_size:14769
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/module_sync job_size:13716
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxop_dev/gnu.53/wipe_build job_size:15310
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/var_summary job_size:35963
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/git_srcs job_size:35954
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/make_build_dir job_size:34607
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/config job_size:35380
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/build job_size:34511
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/test job_size:35319
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/install job_size:35207
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/install_log job_size:38800
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/remove_write_perm job_size:35341
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/module_sync job_size:34181
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.53/wipe_build job_size:35755
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/var_summary job_size:35963
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/git_srcs job_size:35954
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/make_build_dir job_size:34607
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/config job_size:35380
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/build job_size:34511
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/test job_size:35319
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/install job_size:35207
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/install_log job_size:38800
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/remove_write_perm job_size:35341
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/module_sync job_size:34181
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/gnu.62/wipe_build job_size:35755
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/var_summary job_size:35997
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/git_srcs job_size:36018
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/make_build_dir job_size:34645
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/config job_size:35414
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/build job_size:34541
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/test job_size:35349
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/install job_size:35239
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/install_log job_size:38836
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/remove_write_perm job_size:35371
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/module_sync job_size:34209
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/intel.17/wipe_build job_size:35789
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/var_summary job_size:35930
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/git_srcs job_size:35936
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/make_build_dir job_size:34576
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/config job_size:35347
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/build job_size:34476
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/test job_size:35284
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/install job_size:35173
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/install_log job_size:38768
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/remove_write_perm job_size:35306
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/module_sync job_size:34145
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cck/cray.85/wipe_build job_size:35722
-WAR:[12:55:59 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/var_summary job_size:35959
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/git_srcs job_size:35950
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/make_build_dir job_size:34603
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/config job_size:35376
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/build job_size:34507
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/test job_size:35315
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/install job_size:35203
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/install_log job_size:38796
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/remove_write_perm job_size:35337
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/module_sync job_size:34177
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.49/wipe_build job_size:35751
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/var_summary job_size:35959
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/git_srcs job_size:35950
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/make_build_dir job_size:34603
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/config job_size:35376
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/build job_size:34507
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/test job_size:35315
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/install job_size:35203
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/install_log job_size:38796
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/remove_write_perm job_size:35337
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/module_sync job_size:34177
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/gnu.53/wipe_build job_size:35751
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/var_summary job_size:36140
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/git_srcs job_size:36161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/make_build_dir job_size:34788
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/config job_size:35586
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/build job_size:34684
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/test job_size:35492
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/install job_size:35382
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/install_log job_size:38979
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/remove_write_perm job_size:35514
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/module_sync job_size:34352
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.14/wipe_build job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/var_summary job_size:36140
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/git_srcs job_size:36161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/make_build_dir job_size:34788
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/config job_size:35586
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/build job_size:34684
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/test job_size:35492
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/install job_size:35382
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/install_log job_size:38979
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/remove_write_perm job_size:35514
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/module_sync job_size:34352
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.15/wipe_build job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/var_summary job_size:36140
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/git_srcs job_size:36161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/make_build_dir job_size:34788
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/config job_size:35586
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/build job_size:34684
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/test job_size:35492
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/install job_size:35382
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/install_log job_size:38979
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/remove_write_perm job_size:35514
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/module_sync job_size:34352
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/intel.16/wipe_build job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/var_summary job_size:35926
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/git_srcs job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/make_build_dir job_size:34572
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/config job_size:35296
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/build job_size:34472
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/test job_size:35280
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/install job_size:35169
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/install_log job_size:38764
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/remove_write_perm job_size:35302
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/module_sync job_size:34141
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.84/wipe_build job_size:35718
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/var_summary job_size:35926
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/git_srcs job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/make_build_dir job_size:34572
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/config job_size:35296
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/build job_size:34472
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/test job_size:35280
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/install job_size:35169
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/install_log job_size:38764
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/remove_write_perm job_size:35302
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/module_sync job_size:34141
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.85/wipe_build job_size:35718
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/var_summary job_size:35954
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/git_srcs job_size:35975
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/make_build_dir job_size:34602
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/config job_size:35324
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/build job_size:34498
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/test job_size:35306
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/install job_size:35196
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/install_log job_size:38793
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/remove_write_perm job_size:35328
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/module_sync job_size:34166
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cct/cray.846/wipe_build job_size:35746
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/var_summary job_size:15374
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/git_srcs job_size:15130
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/make_build_dir job_size:13885
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/config job_size:14782
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/build job_size:14059
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/test job_size:14889
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/install job_size:14680
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/install_log job_size:18050
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/remove_write_perm job_size:14612
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/module_sync job_size:13617
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappa/wipe_build job_size:15166
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/var_summary job_size:15439
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/git_srcs job_size:15339
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/make_build_dir job_size:13977
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/config job_size:14897
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/build job_size:14115
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/test job_size:14945
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/install job_size:14786
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/install_log job_size:18575
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/remove_write_perm job_size:14709
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/module_sync job_size:13663
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.44/wipe_build job_size:15231
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/var_summary job_size:15415
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/git_srcs job_size:15315
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/make_build_dir job_size:13953
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/config job_size:14873
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/build job_size:14091
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/test job_size:14921
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/install job_size:14762
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/install_log job_size:18551
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/remove_write_perm job_size:14685
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/module_sync job_size:13639
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ecgb/gnu.53/wipe_build job_size:15207
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/var_summary job_size:15401
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/git_srcs job_size:15232
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/make_build_dir job_size:13922
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/config job_size:14850
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/build job_size:14076
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/test job_size:14906
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/install job_size:14743
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/install_log job_size:18533
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/remove_write_perm job_size:14670
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/module_sync job_size:13627
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/gnu.53/wipe_build job_size:15187
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/var_summary job_size:15461
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/git_srcs job_size:15322
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/make_build_dir job_size:13986
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/config job_size:14910
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/build job_size:14132
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/test job_size:14962
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/install job_size:14801
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/install_log job_size:18595
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/remove_write_perm job_size:14726
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/module_sync job_size:13681
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/intel.16/wipe_build job_size:15247
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/var_summary job_size:15439
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/git_srcs job_size:15270
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/make_build_dir job_size:13960
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/config job_size:14888
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/build job_size:14114
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/test job_size:14944
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/install job_size:14781
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/install_log job_size:18571
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/remove_write_perm job_size:14708
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/module_sync job_size:13665
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxg/pgi.16/wipe_build job_size:15225
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/var_summary job_size:15479
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/git_srcs job_size:15412
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/make_build_dir job_size:14011
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/config job_size:14925
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/build job_size:14137
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/test job_size:14967
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/install job_size:14811
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/install_log job_size:18618
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/remove_write_perm job_size:14731
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/module_sync job_size:13689
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.48/wipe_build job_size:15263
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/var_summary job_size:15503
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/git_srcs job_size:15436
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/make_build_dir job_size:14035
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/config job_size:14949
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/build job_size:14161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/test job_size:14991
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/install job_size:14835
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/install_log job_size:18642
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/remove_write_perm job_size:14755
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/module_sync job_size:13713
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.53/wipe_build job_size:15287
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/var_summary job_size:15503
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/git_srcs job_size:15436
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/make_build_dir job_size:14035
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/config job_size:14949
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/build job_size:14161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/test job_size:14991
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/install job_size:14835
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/install_log job_size:18642
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/remove_write_perm job_size:14755
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/module_sync job_size:13713
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/gnu.61/wipe_build job_size:15287
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/var_summary job_size:15487
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/git_srcs job_size:15375
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/make_build_dir job_size:14013
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/config job_size:14933
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/build job_size:14151
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/test job_size:14981
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/install job_size:14822
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/install_log job_size:18623
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/remove_write_perm job_size:14745
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/module_sync job_size:13706
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/opensuse131/pgi/wipe_build job_size:15271
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/var_summary job_size:15424
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/git_srcs job_size:15255
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/make_build_dir job_size:13945
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/config job_size:14959
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/build job_size:14099
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/test job_size:14929
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/install job_size:14766
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/install_log job_size:18556
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/remove_write_perm job_size:14693
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/module_sync job_size:13650
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.49/wipe_build job_size:15210
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/var_summary job_size:15448
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/git_srcs job_size:15279
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/make_build_dir job_size:13969
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/config job_size:14983
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/build job_size:14123
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/test job_size:14953
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/install job_size:14790
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/install_log job_size:18580
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/remove_write_perm job_size:14717
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/module_sync job_size:13674
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/gnu.53/wipe_build job_size:15234
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/var_summary job_size:15432
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/git_srcs job_size:15218
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/make_build_dir job_size:13947
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/config job_size:14967
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/build job_size:14113
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/test job_size:14943
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/install job_size:14777
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/install_log job_size:18561
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/remove_write_perm job_size:14707
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/module_sync job_size:13667
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/lxc/pgi/wipe_build job_size:15218
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/var_summary job_size:15429
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/git_srcs job_size:15287
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/make_build_dir job_size:13951
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/config job_size:14875
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/build job_size:14097
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/test job_size:14927
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/install job_size:14766
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/install_log job_size:18563
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/remove_write_perm job_size:14691
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/module_sync job_size:13649
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.53/wipe_build job_size:15213
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/var_summary job_size:15453
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/git_srcs job_size:15311
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/make_build_dir job_size:13975
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/config job_size:14899
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/build job_size:14121
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/test job_size:14951
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/install job_size:14790
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/install_log job_size:18587
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/remove_write_perm job_size:14715
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/module_sync job_size:13673
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/gnu.61/wipe_build job_size:15237
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/var_summary job_size:15437
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/git_srcs job_size:15250
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/make_build_dir job_size:13953
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/config job_size:14883
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/build job_size:14111
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/test job_size:14941
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/install job_size:14777
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/install_log job_size:18568
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/remove_write_perm job_size:14705
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/module_sync job_size:13666
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/leap42/pgi/wipe_build job_size:15221
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/var_summary job_size:15374
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/git_srcs job_size:15130
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/make_build_dir job_size:13885
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/config job_size:14782
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/build job_size:14059
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/test job_size:14889
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/install job_size:14680
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/install_log job_size:18050
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/remove_write_perm job_size:14612
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/module_sync job_size:13617
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/sappb/wipe_build job_size:15166
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/var_summary job_size:35959
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/git_srcs job_size:35950
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/make_build_dir job_size:34603
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/config job_size:35376
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/build job_size:34507
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/test job_size:35315
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/install job_size:35203
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/install_log job_size:38796
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/remove_write_perm job_size:35337
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/module_sync job_size:34177
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.49/wipe_build job_size:35751
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/var_summary job_size:35959
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/git_srcs job_size:35950
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/make_build_dir job_size:34603
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/config job_size:35376
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/build job_size:34507
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/test job_size:35315
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/install job_size:35203
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/install_log job_size:38796
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/remove_write_perm job_size:35337
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/module_sync job_size:34177
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/gnu.53/wipe_build job_size:35751
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/var_summary job_size:36140
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/git_srcs job_size:36161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/make_build_dir job_size:34788
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/config job_size:35586
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/build job_size:34684
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/test job_size:35492
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/install job_size:35382
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/install_log job_size:38979
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/remove_write_perm job_size:35514
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/module_sync job_size:34352
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.14/wipe_build job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/var_summary job_size:36140
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/git_srcs job_size:36161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/make_build_dir job_size:34788
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/config job_size:35586
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/build job_size:34684
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/test job_size:35492
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/install job_size:35382
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/install_log job_size:38979
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/remove_write_perm job_size:35514
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/module_sync job_size:34352
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.15/wipe_build job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/var_summary job_size:36116
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/git_srcs job_size:36137
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/make_build_dir job_size:34764
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/config job_size:35562
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/build job_size:34660
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/test job_size:35468
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/install job_size:35358
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/install_log job_size:38955
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/remove_write_perm job_size:35490
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/module_sync job_size:34328
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/intel.16/wipe_build job_size:35908
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/var_summary job_size:35926
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/git_srcs job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/make_build_dir job_size:34572
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/config job_size:35296
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/build job_size:34472
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/test job_size:35280
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/install job_size:35169
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/install_log job_size:38764
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/remove_write_perm job_size:35302
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/module_sync job_size:34141
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.84/wipe_build job_size:35718
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/var_summary job_size:35954
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/git_srcs job_size:35975
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/make_build_dir job_size:34602
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/config job_size:35324
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/build job_size:34498
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/test job_size:35306
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/install job_size:35196
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/install_log job_size:38793
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/remove_write_perm job_size:35328
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/module_sync job_size:34166
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/cca/cray.846/wipe_build job_size:35746
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/var_summary job_size:35959
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/git_srcs job_size:35950
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/make_build_dir job_size:34603
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/config job_size:35376
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/build job_size:34507
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/test job_size:35315
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/install job_size:35203
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/install_log job_size:38796
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/remove_write_perm job_size:35337
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/module_sync job_size:34177
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.49/wipe_build job_size:35751
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/var_summary job_size:35959
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/git_srcs job_size:35950
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/make_build_dir job_size:34603
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/config job_size:35376
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/build job_size:34507
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/test job_size:35315
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/install job_size:35203
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/install_log job_size:38796
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/remove_write_perm job_size:35337
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/module_sync job_size:34177
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/gnu.53/wipe_build job_size:35751
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/var_summary job_size:36140
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/git_srcs job_size:36161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/make_build_dir job_size:34788
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/config job_size:35586
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/build job_size:34684
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/test job_size:35492
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/install job_size:35382
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/install_log job_size:38979
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/remove_write_perm job_size:35514
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/module_sync job_size:34352
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.14/wipe_build job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/var_summary job_size:36140
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/git_srcs job_size:36161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/make_build_dir job_size:34788
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/config job_size:35586
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/build job_size:34684
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/test job_size:35492
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/install job_size:35382
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/install_log job_size:38979
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/remove_write_perm job_size:35514
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/module_sync job_size:34352
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.15/wipe_build job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/var_summary job_size:36116
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/git_srcs job_size:36137
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/make_build_dir job_size:34764
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/config job_size:35562
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/build job_size:34660
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/test job_size:35468
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/install job_size:35358
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/install_log job_size:38955
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/remove_write_perm job_size:35490
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/module_sync job_size:34328
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/intel.16/wipe_build job_size:35908
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/var_summary job_size:35926
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/git_srcs job_size:35932
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/make_build_dir job_size:34572
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/config job_size:35296
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/build job_size:34472
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/test job_size:35280
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/install job_size:35169
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/install_log job_size:38764
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/remove_write_perm job_size:35302
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/module_sync job_size:34141
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.84/wipe_build job_size:35718
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/var_summary job_size:35954
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/git_srcs job_size:35975
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/make_build_dir job_size:34602
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/config job_size:35324
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/build job_size:34498
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/test job_size:35306
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/install job_size:35196
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/install_log job_size:38793
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/remove_write_perm job_size:35328
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/module_sync job_size:34166
-LOG:[12:55:59 13.4.2017]  submitted: /atlas/ccb/cray.846/wipe_build job_size:35746
-WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/regenerate job_size:15486
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.53/var_summary job_size:36414
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.53/git_srcs job_size:36573
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.53/make_build_dir job_size:35049
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.53/config job_size:35767
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.53/build job_size:34917
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.53/test job_size:35725
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.53/wipe_build job_size:36188
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.62/var_summary job_size:36414
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.62
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.62/git_srcs job_size:36573
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.62/make_build_dir job_size:35049
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.62/config job_size:35767
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.62/build job_size:34917
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.62/test job_size:35725
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/gnu.62/wipe_build job_size:36188
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/intel.17/var_summary job_size:36448
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/intel.17
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/intel.17/git_srcs job_size:36637
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/intel.17/make_build_dir job_size:35087
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/intel.17/config job_size:35801
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/intel.17/build job_size:34947
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/intel.17/test job_size:35755
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/intel.17/wipe_build job_size:36222
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/cray.85/var_summary job_size:36381
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/cray.85/git_srcs job_size:36555
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/cray.85/make_build_dir job_size:35018
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/cray.85/config job_size:35734
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/cray.85/build job_size:34882
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/cray.85/test job_size:35690
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cck/cray.85/wipe_build job_size:36155
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.49/var_summary job_size:36510
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.49/git_srcs job_size:36669
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.49/make_build_dir job_size:35145
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.49/config job_size:35888
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.49/build job_size:35013
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.49/test job_size:35821
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.49/wipe_build job_size:36284
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.53/var_summary job_size:36510
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.53/git_srcs job_size:36669
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.53/make_build_dir job_size:35145
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.53/config job_size:35888
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.53/build job_size:35013
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.53/test job_size:35821
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/gnu.53/wipe_build job_size:36284
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.14/var_summary job_size:36575
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.14/git_srcs job_size:36764
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.14/make_build_dir job_size:35214
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.14/config job_size:35953
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.14/build job_size:35074
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.14/test job_size:35882
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.14/wipe_build job_size:36349
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.15/var_summary job_size:36575
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.15/git_srcs job_size:36764
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.15/make_build_dir job_size:35214
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.15/config job_size:35953
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.15/build job_size:35074
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.15/test job_size:35882
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.15/wipe_build job_size:36349
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.16/var_summary job_size:36575
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.16/git_srcs job_size:36764
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.16/make_build_dir job_size:35214
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.16/config job_size:35953
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.16/build job_size:35074
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.16/test job_size:35882
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/intel.16/wipe_build job_size:36349
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.84/var_summary job_size:36477
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.84/git_srcs job_size:36651
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.84/make_build_dir job_size:35114
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.84/config job_size:35883
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.84/build job_size:34978
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.84/test job_size:35786
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.84/wipe_build job_size:36251
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.85/var_summary job_size:36477
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.85/git_srcs job_size:36651
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.85/make_build_dir job_size:35114
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.85/config job_size:35883
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.85/build job_size:34978
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.85/test job_size:35786
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.85/wipe_build job_size:36251
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.846/var_summary job_size:36505
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.846/git_srcs job_size:36694
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.846/make_build_dir job_size:35144
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.846/config job_size:35911
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.846/build job_size:35004
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.846/test job_size:35812
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/cct/cray.846/wipe_build job_size:36279
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.44/var_summary job_size:15539
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.44
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.44/git_srcs job_size:15607
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.44/make_build_dir job_size:14068
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.44/config job_size:14933
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.44/build job_size:14170
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.44/test job_size:15000
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.44/wipe_build job_size:15304
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.53/var_summary job_size:15515
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.53/git_srcs job_size:15583
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.53/make_build_dir job_size:14044
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.53/config job_size:14909
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.53/build job_size:14146
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.53/test job_size:14976
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/ecgb/gnu.53/wipe_build job_size:15280
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/gnu.53/var_summary job_size:15501
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/gnu.53/git_srcs job_size:15500
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/gnu.53/make_build_dir job_size:14013
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/gnu.53/config job_size:14886
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/gnu.53/build job_size:14131
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/gnu.53/test job_size:14961
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/gnu.53/wipe_build job_size:15260
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/intel.16/var_summary job_size:15561
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/intel.16/git_srcs job_size:15590
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/intel.16/make_build_dir job_size:14077
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/intel.16/config job_size:14946
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/intel.16/build job_size:14187
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/intel.16/test job_size:15017
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/intel.16/wipe_build job_size:15320
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/pgi.16/var_summary job_size:15573
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/pgi.16
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/pgi.16/git_srcs job_size:15572
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/pgi.16/make_build_dir job_size:14085
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/pgi.16/config job_size:15031
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/pgi.16/build job_size:14203
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/pgi.16/test job_size:15033
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxg/pgi.16/wipe_build job_size:15332
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.48/var_summary job_size:15600
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.48
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.48/git_srcs job_size:15701
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.48/make_build_dir job_size:14123
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.48/config job_size:14982
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.48/build job_size:14213
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.48/test job_size:15043
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.48/wipe_build job_size:15357
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.53/var_summary job_size:15603
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.53/git_srcs job_size:15704
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.53/make_build_dir job_size:14126
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.53/config job_size:14985
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.53/build job_size:14216
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.53/test job_size:15046
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.53/wipe_build job_size:15360
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.61/var_summary job_size:15603
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.61
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.61/git_srcs job_size:15704
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.61/make_build_dir job_size:14126
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.61/config job_size:14985
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.61/build job_size:14216
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.61/test job_size:15046
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/gnu.61/wipe_build job_size:15360
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/pgi/var_summary job_size:15621
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/pgi
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/pgi/git_srcs job_size:15677
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/pgi/make_build_dir job_size:14138
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/pgi/config job_size:15076
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/pgi/build job_size:14240
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/pgi/test job_size:15070
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/opensuse131/pgi/wipe_build job_size:15378
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.49/var_summary job_size:15502
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.49/git_srcs job_size:15501
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.49/make_build_dir job_size:14014
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.49/config job_size:14887
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.49/build job_size:14132
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.49/test job_size:14962
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.49/wipe_build job_size:15261
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.53/var_summary job_size:15526
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.53/git_srcs job_size:15525
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.53/make_build_dir job_size:14038
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.53/config job_size:14911
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.53/build job_size:14156
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.53/test job_size:14986
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/gnu.53/wipe_build job_size:15285
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/pgi/var_summary job_size:15544
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/pgi
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/pgi/git_srcs job_size:15498
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/pgi/make_build_dir job_size:14050
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/pgi/config job_size:15002
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/pgi/build job_size:14180
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/pgi/test job_size:15010
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/lxc/pgi/wipe_build job_size:15303
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.53/var_summary job_size:15529
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.53/git_srcs job_size:15555
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.53/make_build_dir job_size:14042
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.53/config job_size:14911
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.53/build job_size:14152
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.53/test job_size:14982
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.53/wipe_build job_size:15286
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.61/var_summary job_size:15553
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.61
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.61/git_srcs job_size:15579
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.61/make_build_dir job_size:14066
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.61/config job_size:14935
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.61/build job_size:14176
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.61/test job_size:15006
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/gnu.61/wipe_build job_size:15310
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/pgi/var_summary job_size:15571
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/pgi
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/pgi/git_srcs job_size:15552
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/pgi/make_build_dir job_size:14078
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/pgi/config job_size:15026
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/pgi/build job_size:14200
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/pgi/test job_size:15030
-LOG:[12:55:59 13.4.2017]  submitted: /libemos_bundle/leap42/pgi/wipe_build job_size:15328
-WAR:[12:55:59 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/regenerate job_size:15372
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/var_summary job_size:15503
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/git_srcs job_size:15401
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/make_build_dir job_size:14016
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/config job_size:14904
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/build job_size:14158
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/test job_size:14988
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/install job_size:14811
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/install_log job_size:18401
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/remove_write_perm job_size:14736
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/module_sync job_size:13712
-LOG:[12:55:59 13.4.2017]  submitted: /codes_ui/localhost/wipe_build job_size:15283
-LOG:[12:55:59 13.4.2017]  submitted: /metabuilder/regenerate job_size:15429
-LOG:[12:55:59 13.4.2017]  submitted: /metabuilder
-LOG:[12:55:59 13.4.2017]  submitted: /metabuilder/clear_log job_size:16818
-LOG:[12:55:59 13.4.2017]  submitted: /metabuilder/remove_build_dirs job_size:14127
-LOG:[12:55:59 13.4.2017]  submitted: /metabuilder/add_new_package job_size:14638
-LOG:[12:55:59 13.4.2017]  submitted: /metabuilder/generate_report job_size:19654
-LOG:[12:55:59 13.4.2017]  submitted: /metabuilder/remove_lock_file job_size:13474
-LOG:[12:55:59 13.4.2017]  submitted: /mars_client_configs/regenerate job_size:15581
-LOG:[12:55:59 13.4.2017]  submitted: /mars_client_configs
-LOG:[12:55:59 13.4.2017]  submitted: /mars_client_configs/leap42/create/odb_api job_size:14604
-LOG:[12:55:59 13.4.2017]  submitted: /mars_client_configs/leap42/create
-LOG:[12:55:59 13.4.2017]  submitted: /mars_client_configs/leap42
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/regenerate job_size:15592
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle
-WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.53/var_summary job_size:36430
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.53/git_srcs job_size:36546
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.53/make_build_dir job_size:35066
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.53/config job_size:35858
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.53/make_update job_size:34592
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.53/build job_size:34943
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.53/test job_size:35933
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.53/wipe_build job_size:36208
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.62/var_summary job_size:36430
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.62
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.62/git_srcs job_size:36546
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.62/make_build_dir job_size:35066
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.62/config job_size:35858
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.62/make_update job_size:34592
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.62/build job_size:34943
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.62/test job_size:35933
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/gnu.62/wipe_build job_size:36208
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/intel.17/var_summary job_size:36464
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/intel.17
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/intel.17/git_srcs job_size:36610
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/intel.17/make_build_dir job_size:35104
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/intel.17/config job_size:35894
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/intel.17/make_update job_size:34622
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/intel.17/build job_size:34973
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/intel.17/test job_size:35963
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/intel.17/wipe_build job_size:36242
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/cray.85/var_summary job_size:36397
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/cray.85/git_srcs job_size:36528
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/cray.85/make_build_dir job_size:35035
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/cray.85/config job_size:35826
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/cray.85/make_update job_size:34557
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/cray.85/build job_size:34908
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/cray.85/test job_size:35898
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cck/cray.85/wipe_build job_size:36175
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.49/var_summary job_size:36426
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.49/git_srcs job_size:36542
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.49/make_build_dir job_size:35062
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.49/config job_size:35854
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.49/make_update job_size:34588
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.49/build job_size:34939
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.49/test job_size:35929
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.49/wipe_build job_size:36204
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.53/var_summary job_size:36426
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.53/git_srcs job_size:36542
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.53/make_build_dir job_size:35062
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.53/config job_size:35854
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.53/make_update job_size:34588
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.53/build job_size:34939
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.53/test job_size:35929
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/gnu.53/wipe_build job_size:36204
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.14/var_summary job_size:36491
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.14/git_srcs job_size:36637
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.14/make_build_dir job_size:35131
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.14/config job_size:35921
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.14/make_update job_size:34649
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.14/build job_size:35000
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.14/test job_size:35990
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.14/wipe_build job_size:36269
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.15/var_summary job_size:36491
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.15/git_srcs job_size:36637
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.15/make_build_dir job_size:35131
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.15/config job_size:35921
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.15/make_update job_size:34649
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.15/build job_size:35000
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.15/test job_size:35990
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.15/wipe_build job_size:36269
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.16/var_summary job_size:36491
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.16/git_srcs job_size:36637
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.16/make_build_dir job_size:35131
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.16/config job_size:35921
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.16/make_update job_size:34649
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.16/build job_size:35000
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.16/test job_size:35990
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/intel.16/wipe_build job_size:36269
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.84/var_summary job_size:36393
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.84/git_srcs job_size:36524
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.84/make_build_dir job_size:35031
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.84/config job_size:35822
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.84/make_update job_size:34553
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.84/build job_size:34904
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.84/test job_size:35894
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.84/wipe_build job_size:36171
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.85/var_summary job_size:36393
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.85/git_srcs job_size:36524
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.85/make_build_dir job_size:35031
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.85/config job_size:35822
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.85/make_update job_size:34553
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.85/build job_size:34904
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.85/test job_size:35894
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.85/wipe_build job_size:36171
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.846/var_summary job_size:36421
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.846/git_srcs job_size:36567
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.846/make_build_dir job_size:35061
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.846/config job_size:35851
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.846/make_update job_size:34579
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.846/build job_size:34930
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.846/test job_size:35920
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cct/cray.846/wipe_build job_size:36199
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/gnu.53/var_summary job_size:15697
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/gnu.53/git_srcs job_size:15653
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/gnu.53/make_build_dir job_size:14210
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/gnu.53/config job_size:15196
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/gnu.53/make_update job_size:13854
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/gnu.53/build job_size:14337
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/gnu.53/test job_size:15349
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/gnu.53/wipe_build job_size:15462
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/intel.16/var_summary job_size:15735
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/intel.16/git_srcs job_size:15721
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/intel.16/make_build_dir job_size:14252
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/intel.16/config job_size:15236
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/intel.16/make_update job_size:13888
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/intel.16/build job_size:14371
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/intel.16/test job_size:15383
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/intel.16/wipe_build job_size:15500
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/pgi.16/var_summary job_size:15789
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/pgi.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/pgi.16/git_srcs job_size:15745
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/pgi.16/make_build_dir job_size:14302
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/pgi.16/config job_size:15288
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/pgi.16/make_update job_size:13946
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/pgi.16/build job_size:14429
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/pgi.16/test job_size:15441
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxg/pgi.16/wipe_build job_size:15554
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.48/var_summary job_size:15751
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.48
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.48/git_srcs job_size:15809
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.48/make_build_dir job_size:14275
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.48/config job_size:15202
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.48/make_update job_size:13891
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.48/build job_size:14374
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.48/test job_size:15386
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.48/wipe_build job_size:15514
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.53/var_summary job_size:15775
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.53/git_srcs job_size:15833
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.53/make_build_dir job_size:14299
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.53/config job_size:15226
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.53/make_update job_size:13915
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.53/build job_size:14398
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.53/test job_size:15410
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.53/wipe_build job_size:15538
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.61/var_summary job_size:15775
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.61
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.61/git_srcs job_size:15833
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.61/make_build_dir job_size:14299
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.61/config job_size:15226
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.61/make_update job_size:13915
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.61/build job_size:14398
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.61/test job_size:15410
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/gnu.61/wipe_build job_size:15538
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/intel.16/var_summary job_size:15808
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/intel.16/git_srcs job_size:15896
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/intel.16/make_build_dir job_size:14336
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/intel.16/config job_size:15261
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/intel.16/make_update job_size:13944
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/intel.16/build job_size:14427
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/intel.16/test job_size:15439
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/opensuse131/intel.16/wipe_build job_size:15571
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.49/var_summary job_size:15596
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.49/git_srcs job_size:15552
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.49/make_build_dir job_size:14109
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.49/config job_size:15043
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.49/make_update job_size:13753
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.49/build job_size:14236
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.49/test job_size:15248
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.49/wipe_build job_size:15361
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.53/var_summary job_size:15620
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.53/git_srcs job_size:15576
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.53/make_build_dir job_size:14133
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.53/config job_size:15067
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.53/make_update job_size:13777
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.53/build job_size:14260
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.53/test job_size:15272
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/gnu.53/wipe_build job_size:15385
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/pgi/var_summary job_size:15604
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/pgi
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/pgi/git_srcs job_size:15515
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/pgi/make_build_dir job_size:14111
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/pgi/config job_size:15048
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/pgi/make_update job_size:13767
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/pgi/build job_size:14250
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/pgi/test job_size:15262
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/lxc/pgi/wipe_build job_size:15369
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.53/var_summary job_size:15623
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.53/git_srcs job_size:15606
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.53/make_build_dir job_size:14137
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.53/config job_size:15069
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.53/make_update job_size:13773
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.53/build job_size:14256
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.53/test job_size:15268
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.53/wipe_build job_size:15386
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.61/var_summary job_size:15647
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.61
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.61/git_srcs job_size:15630
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.61/make_build_dir job_size:14161
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.61/config job_size:15093
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.61/make_update job_size:13797
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.61/build job_size:14280
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.61/test job_size:15292
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/gnu.61/wipe_build job_size:15410
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/pgi/var_summary job_size:15631
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/pgi
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/pgi/git_srcs job_size:15569
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/pgi/make_build_dir job_size:14139
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/pgi/config job_size:15074
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/pgi/make_update job_size:13787
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/pgi/build job_size:14270
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/pgi/test job_size:15282
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/leap42/pgi/wipe_build job_size:15394
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.49/var_summary job_size:36426
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.49/git_srcs job_size:36542
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.49/make_build_dir job_size:35062
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.49/config job_size:35854
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.49/make_update job_size:34588
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.49/build job_size:34939
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.49/test job_size:35929
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.49/wipe_build job_size:36204
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.53/var_summary job_size:36426
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.53/git_srcs job_size:36542
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.53/make_build_dir job_size:35062
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.53/config job_size:35854
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.53/make_update job_size:34588
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.53/build job_size:34939
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.53/test job_size:35929
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/gnu.53/wipe_build job_size:36204
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.14/var_summary job_size:36491
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.14/git_srcs job_size:36637
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.14/make_build_dir job_size:35131
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.14/config job_size:35921
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.14/make_update job_size:34649
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.14/build job_size:35000
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.14/test job_size:35990
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.14/wipe_build job_size:36269
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.15/var_summary job_size:36491
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.15/git_srcs job_size:36637
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.15/make_build_dir job_size:35131
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.15/config job_size:35921
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.15/make_update job_size:34649
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.15/build job_size:35000
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.15/test job_size:35990
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.15/wipe_build job_size:36269
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.16/var_summary job_size:36467
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.16/git_srcs job_size:36613
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.16/make_build_dir job_size:35107
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.16/config job_size:35897
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.16/make_update job_size:34625
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.16/build job_size:34976
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.16/test job_size:35966
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/intel.16/wipe_build job_size:36245
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.84/var_summary job_size:36393
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.84/git_srcs job_size:36524
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.84/make_build_dir job_size:35031
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.84/config job_size:35822
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.84/make_update job_size:34553
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.84/build job_size:34904
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.84/test job_size:35894
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.84/wipe_build job_size:36171
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.846/var_summary job_size:36421
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.846/git_srcs job_size:36567
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.846/make_build_dir job_size:35061
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.846/config job_size:35851
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.846/make_update job_size:34579
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.846/build job_size:34930
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.846/test job_size:35920
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/cca/cray.846/wipe_build job_size:36199
-WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.49/var_summary job_size:36426
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.49/git_srcs job_size:36542
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.49/make_build_dir job_size:35062
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.49/config job_size:35854
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.49/make_update job_size:34588
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.49/build job_size:34939
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.49/test job_size:35929
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.49/wipe_build job_size:36204
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.53/var_summary job_size:36426
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.53/git_srcs job_size:36542
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.53/make_build_dir job_size:35062
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.53/config job_size:35854
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.53/make_update job_size:34588
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.53/build job_size:34939
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.53/test job_size:35929
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/gnu.53/wipe_build job_size:36204
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.14/var_summary job_size:36491
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.14/git_srcs job_size:36637
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.14/make_build_dir job_size:35131
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.14/config job_size:35921
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.14/make_update job_size:34649
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.14/build job_size:35000
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.14/test job_size:35990
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.14/wipe_build job_size:36269
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.15/var_summary job_size:36491
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.15/git_srcs job_size:36637
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.15/make_build_dir job_size:35131
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.15/config job_size:35921
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.15/make_update job_size:34649
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.15/build job_size:35000
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.15/test job_size:35990
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.15/wipe_build job_size:36269
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.16/var_summary job_size:36467
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.16/git_srcs job_size:36613
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.16/make_build_dir job_size:35107
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.16/config job_size:35897
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.16/make_update job_size:34625
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.16/build job_size:34976
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.16/test job_size:35966
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/intel.16/wipe_build job_size:36245
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.84/var_summary job_size:36393
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.84/git_srcs job_size:36524
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.84/make_build_dir job_size:35031
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.84/config job_size:35822
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.84/make_update job_size:34553
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.84/build job_size:34904
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.84/test job_size:35894
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.84/wipe_build job_size:36171
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.846/var_summary job_size:36421
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.846
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.846/git_srcs job_size:36567
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.846/make_build_dir job_size:35061
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.846/config job_size:35851
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.846/make_update job_size:34579
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.846/build job_size:34930
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.846/test job_size:35920
-LOG:[12:55:59 13.4.2017]  submitted: /atlas_bundle/ccb/cray.846/wipe_build job_size:36199
-LOG:[12:55:59 13.4.2017]  submitted: /mars_compare/regenerate job_size:15449
-LOG:[12:55:59 13.4.2017]  submitted: /mars_compare
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/regenerate job_size:15459
-LOG:[12:55:59 13.4.2017]  submitted: /eigen
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/var_summary job_size:35843
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/download job_size:34233
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/make_build_dir job_size:34478
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/config job_size:35162
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/build job_size:34418
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/add_write_perm job_size:35117
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/install job_size:35082
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/install_log job_size:38530
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/remove_write_perm job_size:35222
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/module_sync job_size:34082
-LOG:[12:55:59 13.4.2017]  submitted: /eigen/cck/wipe_build job_size:35637
-WAR:[12:55:59 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/regenerate job_size:15315
-LOG:[12:55:59 13.4.2017]  submitted: /eckit
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/var_summary job_size:15505
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/git_srcs job_size:15484
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/make_build_dir job_size:14066
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/config job_size:14955
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/build job_size:14176
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/test job_size:15006
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/add_write_perm job_size:14731
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/install job_size:14854
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/install_log job_size:18648
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/remove_write_perm job_size:14770
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/module_sync job_size:13717
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.49/wipe_build job_size:15311
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/var_summary job_size:15529
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/git_srcs job_size:15508
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/make_build_dir job_size:14090
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/config job_size:14979
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/build job_size:14200
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/test job_size:15030
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/add_write_perm job_size:14755
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/install job_size:14878
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/install_log job_size:18672
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/remove_write_perm job_size:14794
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/module_sync job_size:13741
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/lxop_dev/gnu.53/wipe_build job_size:15335
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/var_summary job_size:35988
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/git_srcs job_size:35944
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/make_build_dir job_size:34632
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/config job_size:35363
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/build job_size:34536
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/test job_size:35344
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/add_write_perm job_size:35261
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/install job_size:35232
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/install_log job_size:38825
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/remove_write_perm job_size:35366
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/module_sync job_size:34206
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.53/wipe_build job_size:35780
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/var_summary job_size:35988
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/git_srcs job_size:35944
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/make_build_dir job_size:34632
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/config job_size:35363
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/build job_size:34536
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/test job_size:35344
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/add_write_perm job_size:35261
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/install job_size:35232
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/install_log job_size:38825
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/remove_write_perm job_size:35366
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/module_sync job_size:34206
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/gnu.62/wipe_build job_size:35780
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/var_summary job_size:36022
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/git_srcs job_size:36008
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/make_build_dir job_size:34670
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/config job_size:35397
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/build job_size:34566
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/test job_size:35374
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/add_write_perm job_size:35291
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/install job_size:35264
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/install_log job_size:38861
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/remove_write_perm job_size:35396
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/module_sync job_size:34234
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/intel.17/wipe_build job_size:35814
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/var_summary job_size:35955
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/git_srcs job_size:35926
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/make_build_dir job_size:34601
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/config job_size:35330
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/build job_size:34501
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/test job_size:35309
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/add_write_perm job_size:35226
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/install job_size:35198
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/install_log job_size:38793
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/remove_write_perm job_size:35331
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/module_sync job_size:34170
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cck/cray.85/wipe_build job_size:35747
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/var_summary job_size:35984
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/git_srcs job_size:35940
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/make_build_dir job_size:34628
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/config job_size:35359
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/build job_size:34532
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/test job_size:35340
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/add_write_perm job_size:35257
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/install job_size:35228
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/install_log job_size:38821
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/remove_write_perm job_size:35362
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/module_sync job_size:34202
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.49/wipe_build job_size:35776
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/var_summary job_size:35957
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/git_srcs job_size:35913
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/make_build_dir job_size:34601
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/config job_size:35332
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/build job_size:34505
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/test job_size:35313
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/add_write_perm job_size:35230
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/install job_size:35201
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/install_log job_size:38794
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/remove_write_perm job_size:35335
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/module_sync job_size:34175
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/gnu.53/wipe_build job_size:35749
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/var_summary job_size:36049
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/git_srcs job_size:36035
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/make_build_dir job_size:34697
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/config job_size:35424
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/build job_size:34593
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/test job_size:35401
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/add_write_perm job_size:35318
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/install job_size:35291
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/install_log job_size:38888
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/remove_write_perm job_size:35423
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/module_sync job_size:34261
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.14/wipe_build job_size:35841
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/var_summary job_size:36049
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/git_srcs job_size:36035
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/make_build_dir job_size:34697
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/config job_size:35424
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/build job_size:34593
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/test job_size:35401
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/add_write_perm job_size:35318
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/install job_size:35291
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/install_log job_size:38888
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/remove_write_perm job_size:35423
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/module_sync job_size:34261
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.15/wipe_build job_size:35841
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/var_summary job_size:36049
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/git_srcs job_size:36035
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/make_build_dir job_size:34697
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/config job_size:35424
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/build job_size:34593
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/test job_size:35401
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/add_write_perm job_size:35318
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/install job_size:35291
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/install_log job_size:38888
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/remove_write_perm job_size:35423
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/module_sync job_size:34261
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/intel.16/wipe_build job_size:35841
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/cray.84/var_summary job_size:35951
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/cray.84
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/cray.84/git_srcs job_size:35922
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/cray.84/make_build_dir job_size:34597
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/cray.84/config job_size:35326
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/cray.84/build job_size:34497
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/cray.84/test job_size:35305
-LOG:[12:55:59 13.4.2017]  submitted: /eckit/cct/cray.84/add_write_perm job_size:35222
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.84/install job_size:35194
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.84/install_log job_size:38789
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.84/remove_write_perm job_size:35327
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.84/module_sync job_size:34166
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.84/wipe_build job_size:35743
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/var_summary job_size:35951
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/git_srcs job_size:35922
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/make_build_dir job_size:34597
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/config job_size:35326
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/build job_size:34497
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/test job_size:35305
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/add_write_perm job_size:35222
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/install job_size:35194
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/install_log job_size:38789
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/remove_write_perm job_size:35327
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/module_sync job_size:34166
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.85/wipe_build job_size:35743
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/var_summary job_size:35979
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/git_srcs job_size:35965
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/make_build_dir job_size:34627
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/config job_size:35354
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/build job_size:34523
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/test job_size:35331
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/add_write_perm job_size:35248
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/install job_size:35221
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/install_log job_size:38818
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/remove_write_perm job_size:35353
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/module_sync job_size:34191
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cct/cray.846/wipe_build job_size:35771
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/var_summary job_size:15399
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/git_srcs job_size:15120
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/make_build_dir job_size:13910
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/config job_size:14765
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/build job_size:14084
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/test job_size:14914
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/add_write_perm job_size:14598
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/install job_size:14705
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/install_log job_size:18075
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/remove_write_perm job_size:14637
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/module_sync job_size:13642
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappa/wipe_build job_size:15191
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/var_summary job_size:15464
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/git_srcs job_size:15329
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/make_build_dir job_size:14002
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/config job_size:14880
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/build job_size:14140
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/test job_size:14970
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/add_write_perm job_size:14695
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/install job_size:14811
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/install_log job_size:18600
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/remove_write_perm job_size:14734
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/module_sync job_size:13688
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.44/wipe_build job_size:15256
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/var_summary job_size:15413
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/git_srcs job_size:15278
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/make_build_dir job_size:13951
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/config job_size:14829
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/build job_size:14089
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/test job_size:14919
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/add_write_perm job_size:14644
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/install job_size:14760
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/install_log job_size:18549
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/remove_write_perm job_size:14683
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/module_sync job_size:13637
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ecgb/gnu.53/wipe_build job_size:15205
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/var_summary job_size:15426
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/git_srcs job_size:15222
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/make_build_dir job_size:13947
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/config job_size:14903
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/build job_size:14101
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/test job_size:14931
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/add_write_perm job_size:14656
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/install job_size:14768
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/install_log job_size:18558
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/remove_write_perm job_size:14695
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/module_sync job_size:13652
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/gnu.53/wipe_build job_size:15212
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/var_summary job_size:15486
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/git_srcs job_size:15312
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/make_build_dir job_size:14011
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/config job_size:14963
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/build job_size:14157
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/test job_size:14987
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/add_write_perm job_size:14712
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/install job_size:14826
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/install_log job_size:18620
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/remove_write_perm job_size:14751
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/module_sync job_size:13706
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/intel.16/wipe_build job_size:15272
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/var_summary job_size:15464
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/git_srcs job_size:15260
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/make_build_dir job_size:13985
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/config job_size:14941
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/build job_size:14139
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/test job_size:14969
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/add_write_perm job_size:14694
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/install job_size:14806
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/install_log job_size:18596
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/remove_write_perm job_size:14733
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/module_sync job_size:13690
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxg/pgi.16/wipe_build job_size:15250
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/var_summary job_size:15504
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/git_srcs job_size:15402
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/make_build_dir job_size:14036
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/config job_size:14908
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/build job_size:14162
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/test job_size:14992
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/add_write_perm job_size:14717
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/install job_size:14836
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/install_log job_size:18643
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/remove_write_perm job_size:14756
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/module_sync job_size:13714
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.48/wipe_build job_size:15288
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/var_summary job_size:15528
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/git_srcs job_size:15426
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/make_build_dir job_size:14060
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/config job_size:14932
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/build job_size:14186
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/test job_size:15016
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/add_write_perm job_size:14741
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/install job_size:14860
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/install_log job_size:18667
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/remove_write_perm job_size:14780
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/module_sync job_size:13738
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.53/wipe_build job_size:15312
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/var_summary job_size:15528
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/git_srcs job_size:15426
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/make_build_dir job_size:14060
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/config job_size:14932
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/build job_size:14186
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/test job_size:15016
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/add_write_perm job_size:14741
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/install job_size:14860
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/install_log job_size:18667
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/remove_write_perm job_size:14780
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/module_sync job_size:13738
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/gnu.61/wipe_build job_size:15312
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/var_summary job_size:15512
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/git_srcs job_size:15365
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/make_build_dir job_size:14038
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/config job_size:14916
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/build job_size:14176
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/test job_size:15006
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/add_write_perm job_size:14731
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/install job_size:14847
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/install_log job_size:18648
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/remove_write_perm job_size:14770
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/module_sync job_size:13731
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/opensuse131/pgi/wipe_build job_size:15296
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/var_summary job_size:15427
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/git_srcs job_size:15223
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/make_build_dir job_size:13948
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/config job_size:14834
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/build job_size:14102
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/test job_size:14932
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/add_write_perm job_size:14657
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/install job_size:14769
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/install_log job_size:18559
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/remove_write_perm job_size:14696
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/module_sync job_size:13653
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.49/wipe_build job_size:15213
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/var_summary job_size:15424
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/git_srcs job_size:15220
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/make_build_dir job_size:13945
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/config job_size:14831
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/build job_size:14099
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/test job_size:14929
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/add_write_perm job_size:14654
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/install job_size:14766
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/install_log job_size:18556
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/remove_write_perm job_size:14693
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/module_sync job_size:13650
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/gnu.53/wipe_build job_size:15210
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/var_summary job_size:15435
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/git_srcs job_size:15186
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/make_build_dir job_size:13950
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/config job_size:14842
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/build job_size:14116
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/test job_size:14946
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/add_write_perm job_size:14671
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/install job_size:14780
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/install_log job_size:18564
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/remove_write_perm job_size:14710
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/module_sync job_size:13670
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/lxc/pgi/wipe_build job_size:15221
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/var_summary job_size:15454
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/git_srcs job_size:15277
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/make_build_dir job_size:13976
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/config job_size:14858
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/build job_size:14122
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/test job_size:14952
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/add_write_perm job_size:14677
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/install job_size:14791
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/install_log job_size:18588
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/remove_write_perm job_size:14716
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/module_sync job_size:13674
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.53/wipe_build job_size:15238
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/var_summary job_size:15478
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/git_srcs job_size:15301
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/make_build_dir job_size:14000
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/config job_size:14882
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/build job_size:14146
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/test job_size:14976
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/add_write_perm job_size:14701
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/install job_size:14815
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/install_log job_size:18612
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/remove_write_perm job_size:14740
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/module_sync job_size:13698
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/gnu.61/wipe_build job_size:15262
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/var_summary job_size:15462
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/git_srcs job_size:15240
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/make_build_dir job_size:13978
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/config job_size:14866
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/build job_size:14136
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/test job_size:14966
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/add_write_perm job_size:14691
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/install job_size:14802
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/install_log job_size:18593
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/remove_write_perm job_size:14730
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/module_sync job_size:13691
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/leap42/pgi/wipe_build job_size:15246
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/var_summary job_size:15399
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/git_srcs job_size:15120
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/make_build_dir job_size:13910
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/config job_size:14765
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/build job_size:14084
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/test job_size:14914
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/add_write_perm job_size:14598
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/install job_size:14705
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/install_log job_size:18075
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/remove_write_perm job_size:14637
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/module_sync job_size:13642
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/sappb/wipe_build job_size:15191
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/var_summary job_size:35984
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/git_srcs job_size:35940
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/make_build_dir job_size:34628
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/config job_size:35359
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/build job_size:34532
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/test job_size:35340
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/add_write_perm job_size:35257
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/install job_size:35228
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/install_log job_size:38821
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/remove_write_perm job_size:35362
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/module_sync job_size:34202
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.49/wipe_build job_size:35776
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/var_summary job_size:35957
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/git_srcs job_size:35913
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/make_build_dir job_size:34601
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/config job_size:35332
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/build job_size:34505
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/test job_size:35313
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/add_write_perm job_size:35230
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/install job_size:35201
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/install_log job_size:38794
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/remove_write_perm job_size:35335
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/module_sync job_size:34175
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/gnu.53/wipe_build job_size:35749
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/var_summary job_size:36049
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/git_srcs job_size:36035
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/make_build_dir job_size:34697
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/config job_size:35424
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/build job_size:34593
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/test job_size:35401
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/add_write_perm job_size:35318
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/install job_size:35291
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/install_log job_size:38888
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/remove_write_perm job_size:35423
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/module_sync job_size:34261
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.14/wipe_build job_size:35841
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/var_summary job_size:36049
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/git_srcs job_size:36035
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/make_build_dir job_size:34697
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/config job_size:35424
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/build job_size:34593
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/test job_size:35401
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/add_write_perm job_size:35318
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/install job_size:35291
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/install_log job_size:38888
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/remove_write_perm job_size:35423
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/module_sync job_size:34261
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.15/wipe_build job_size:35841
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/var_summary job_size:36025
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/git_srcs job_size:36011
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/make_build_dir job_size:34673
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/config job_size:35400
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/build job_size:34569
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/test job_size:35377
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/add_write_perm job_size:35294
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/install job_size:35267
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/install_log job_size:38864
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/remove_write_perm job_size:35399
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/module_sync job_size:34237
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/intel.16/wipe_build job_size:35817
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/var_summary job_size:35951
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/git_srcs job_size:35922
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/make_build_dir job_size:34597
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/config job_size:35326
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/build job_size:34497
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/test job_size:35305
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/add_write_perm job_size:35222
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/install job_size:35194
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/install_log job_size:38789
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/remove_write_perm job_size:35327
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/module_sync job_size:34166
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.84/wipe_build job_size:35743
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/var_summary job_size:35979
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/git_srcs job_size:35965
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/make_build_dir job_size:34627
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/config job_size:35354
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/build job_size:34523
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/test job_size:35331
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/add_write_perm job_size:35248
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/install job_size:35221
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/install_log job_size:38818
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/remove_write_perm job_size:35353
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/module_sync job_size:34191
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/cca/cray.846/wipe_build job_size:35771
-WAR:[12:56:00 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/var_summary job_size:35984
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/git_srcs job_size:35940
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/make_build_dir job_size:34628
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/config job_size:35359
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/build job_size:34532
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/test job_size:35340
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/add_write_perm job_size:35257
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/install job_size:35228
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/install_log job_size:38821
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/remove_write_perm job_size:35362
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/module_sync job_size:34202
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.49/wipe_build job_size:35776
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/var_summary job_size:35957
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/git_srcs job_size:35913
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/make_build_dir job_size:34601
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/config job_size:35332
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/build job_size:34505
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/test job_size:35313
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/add_write_perm job_size:35230
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/install job_size:35201
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/install_log job_size:38794
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/remove_write_perm job_size:35335
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/module_sync job_size:34175
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/gnu.53/wipe_build job_size:35749
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/var_summary job_size:36049
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/git_srcs job_size:36035
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/make_build_dir job_size:34697
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/config job_size:35424
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/build job_size:34593
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/test job_size:35401
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/add_write_perm job_size:35318
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/install job_size:35291
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/install_log job_size:38888
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/remove_write_perm job_size:35423
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/module_sync job_size:34261
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.14/wipe_build job_size:35841
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/var_summary job_size:36049
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/git_srcs job_size:36035
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/make_build_dir job_size:34697
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/config job_size:35424
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/build job_size:34593
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/test job_size:35401
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/add_write_perm job_size:35318
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/install job_size:35291
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/install_log job_size:38888
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/remove_write_perm job_size:35423
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/module_sync job_size:34261
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.15/wipe_build job_size:35841
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/var_summary job_size:36025
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/git_srcs job_size:36011
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/make_build_dir job_size:34673
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/config job_size:35400
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/build job_size:34569
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/test job_size:35377
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/add_write_perm job_size:35294
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/install job_size:35267
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/install_log job_size:38864
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/remove_write_perm job_size:35399
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/module_sync job_size:34237
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/intel.16/wipe_build job_size:35817
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/var_summary job_size:35951
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/git_srcs job_size:35922
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/make_build_dir job_size:34597
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/config job_size:35326
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/build job_size:34497
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/test job_size:35305
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/add_write_perm job_size:35222
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/install job_size:35194
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/install_log job_size:38789
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/remove_write_perm job_size:35327
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/module_sync job_size:34166
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.84/wipe_build job_size:35743
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/var_summary job_size:35979
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/git_srcs job_size:35965
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/make_build_dir job_size:34627
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/config job_size:35354
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/build job_size:34523
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/test job_size:35331
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/add_write_perm job_size:35248
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/install job_size:35221
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/install_log job_size:38818
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/remove_write_perm job_size:35353
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/module_sync job_size:34191
-LOG:[12:56:00 13.4.2017]  submitted: /eckit/ccb/cray.846/wipe_build job_size:35771
-LOG:[12:56:00 13.4.2017]  submitted: /odb/regenerate job_size:15277
-LOG:[12:56:00 13.4.2017]  submitted: /odb
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/var_summary job_size:15429
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/git_srcs job_size:15355
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/make_build_dir job_size:13992
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/config job_size:14852
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/build job_size:14110
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/test job_size:14940
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/add_write_perm job_size:14658
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/install job_size:14778
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/install_log job_size:18545
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/remove_write_perm job_size:14697
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/module_sync job_size:13651
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.49/wipe_build job_size:15241
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/var_summary job_size:15453
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/git_srcs job_size:15379
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/make_build_dir job_size:14016
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/config job_size:14876
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/build job_size:14134
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/test job_size:14964
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/add_write_perm job_size:14682
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/install job_size:14802
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/install_log job_size:18569
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/remove_write_perm job_size:14721
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/module_sync job_size:13675
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxop_dev/gnu.53/wipe_build job_size:15265
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/var_summary job_size:35834
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/git_srcs job_size:35737
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/make_build_dir job_size:34480
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/config job_size:35182
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/build job_size:34392
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/test job_size:35200
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/add_write_perm job_size:35110
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/install job_size:35078
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/install_log job_size:38644
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/remove_write_perm job_size:35215
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/module_sync job_size:34062
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.53/wipe_build job_size:35630
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/var_summary job_size:35834
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/git_srcs job_size:35737
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/make_build_dir job_size:34480
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/config job_size:35182
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/build job_size:34392
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/test job_size:35200
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/add_write_perm job_size:35110
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/install job_size:35078
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/install_log job_size:38644
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/remove_write_perm job_size:35215
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/module_sync job_size:34062
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/gnu.62/wipe_build job_size:35630
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/var_summary job_size:35868
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/git_srcs job_size:35801
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/make_build_dir job_size:34518
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/config job_size:35245
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/build job_size:34422
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/test job_size:35230
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/add_write_perm job_size:35140
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/install job_size:35110
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/install_log job_size:38680
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/remove_write_perm job_size:35245
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/module_sync job_size:34090
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/intel.17/wipe_build job_size:35664
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/var_summary job_size:35801
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/git_srcs job_size:35719
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/make_build_dir job_size:34449
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/config job_size:35177
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/build job_size:34357
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/test job_size:35165
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/add_write_perm job_size:35075
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/install job_size:35044
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/install_log job_size:38612
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/remove_write_perm job_size:35180
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/module_sync job_size:34026
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cck/cray.85/wipe_build job_size:35597
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/var_summary job_size:35830
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/git_srcs job_size:35733
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/make_build_dir job_size:34476
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/config job_size:35178
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/build job_size:34388
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/test job_size:35196
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/add_write_perm job_size:35106
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/install job_size:35074
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/install_log job_size:38640
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/remove_write_perm job_size:35211
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/module_sync job_size:34058
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.49/wipe_build job_size:35626
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/var_summary job_size:35830
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/git_srcs job_size:35733
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/make_build_dir job_size:34476
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/config job_size:35178
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/build job_size:34388
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/test job_size:35196
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/add_write_perm job_size:35106
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/install job_size:35074
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/install_log job_size:38640
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/remove_write_perm job_size:35211
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/module_sync job_size:34058
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/gnu.53/wipe_build job_size:35626
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/var_summary job_size:35895
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/git_srcs job_size:35828
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/make_build_dir job_size:34545
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/config job_size:35296
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/build job_size:34449
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/test job_size:35257
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/add_write_perm job_size:35167
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/install job_size:35137
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/install_log job_size:38707
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/remove_write_perm job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/module_sync job_size:34117
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.14/wipe_build job_size:35691
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/var_summary job_size:35895
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/git_srcs job_size:35828
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/make_build_dir job_size:34545
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/config job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/build job_size:34449
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/test job_size:35257
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/add_write_perm job_size:35167
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/install job_size:35137
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/install_log job_size:38707
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/remove_write_perm job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/module_sync job_size:34117
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.15/wipe_build job_size:35691
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/var_summary job_size:35895
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/git_srcs job_size:35828
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/make_build_dir job_size:34545
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/config job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/build job_size:34449
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/test job_size:35257
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/add_write_perm job_size:35167
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/install job_size:35137
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/install_log job_size:38707
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/remove_write_perm job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/module_sync job_size:34117
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/intel.16/wipe_build job_size:35691
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/var_summary job_size:35797
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/git_srcs job_size:35715
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/make_build_dir job_size:34445
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/config job_size:35173
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/build job_size:34353
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/test job_size:35161
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/add_write_perm job_size:35071
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/install job_size:35040
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/install_log job_size:38608
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/remove_write_perm job_size:35176
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/module_sync job_size:34022
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.84/wipe_build job_size:35593
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/var_summary job_size:35797
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/git_srcs job_size:35715
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/make_build_dir job_size:34445
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/config job_size:35173
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/build job_size:34353
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/test job_size:35161
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/add_write_perm job_size:35071
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/install job_size:35040
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/install_log job_size:38608
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/remove_write_perm job_size:35176
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/module_sync job_size:34022
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.85/wipe_build job_size:35593
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/var_summary job_size:35825
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/git_srcs job_size:35758
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/make_build_dir job_size:34475
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/config job_size:35201
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/build job_size:34379
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/test job_size:35187
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/add_write_perm job_size:35097
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/install job_size:35067
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/install_log job_size:38637
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/remove_write_perm job_size:35202
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/module_sync job_size:34047
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cct/cray.846/wipe_build job_size:35621
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/var_summary job_size:15317
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/git_srcs job_size:14985
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/make_build_dir job_size:13830
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/config job_size:14656
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/build job_size:14012
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/test job_size:14842
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/add_write_perm job_size:14519
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/install job_size:14623
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/install_log job_size:17966
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/remove_write_perm job_size:14558
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/module_sync job_size:13570
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappa/wipe_build job_size:15113
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/var_summary job_size:15388
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/git_srcs job_size:15200
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/make_build_dir job_size:13928
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/config job_size:14777
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/build job_size:14074
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/test job_size:14904
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/add_write_perm job_size:14622
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/install job_size:14735
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/install_log job_size:18497
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/remove_write_perm job_size:14661
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/module_sync job_size:13622
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.44/wipe_build job_size:15186
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/var_summary job_size:15364
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/git_srcs job_size:15176
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/make_build_dir job_size:13904
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/config job_size:14753
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/build job_size:14050
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/test job_size:14880
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/add_write_perm job_size:14598
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/install job_size:14711
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/install_log job_size:18473
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/remove_write_perm job_size:14637
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/module_sync job_size:13598
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ecgb/gnu.53/wipe_build job_size:15162
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/var_summary job_size:15350
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/git_srcs job_size:15093
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/make_build_dir job_size:13873
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/config job_size:14730
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/build job_size:14035
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/test job_size:14865
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/add_write_perm job_size:14583
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/install job_size:14692
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/install_log job_size:18455
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/remove_write_perm job_size:14622
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/module_sync job_size:13586
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/gnu.53/wipe_build job_size:15142
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/var_summary job_size:15410
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/git_srcs job_size:15183
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/make_build_dir job_size:13937
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/config job_size:14790
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/build job_size:14091
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/test job_size:14921
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/add_write_perm job_size:14639
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/install job_size:14750
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/install_log job_size:18517
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/remove_write_perm job_size:14678
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/module_sync job_size:13640
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/intel.16/wipe_build job_size:15202
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/var_summary job_size:15388
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/git_srcs job_size:15131
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/make_build_dir job_size:13911
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/config job_size:14768
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/build job_size:14073
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/test job_size:14903
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/add_write_perm job_size:14621
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/install job_size:14730
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/install_log job_size:18493
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/remove_write_perm job_size:14660
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/module_sync job_size:13624
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxg/pgi.16/wipe_build job_size:15180
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/var_summary job_size:15428
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/git_srcs job_size:15273
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/make_build_dir job_size:13962
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/config job_size:14805
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/build job_size:14096
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/test job_size:14926
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/add_write_perm job_size:14644
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/install job_size:14760
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/install_log job_size:18540
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/remove_write_perm job_size:14683
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/module_sync job_size:13648
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.48/wipe_build job_size:15218
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/var_summary job_size:15452
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/git_srcs job_size:15297
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/make_build_dir job_size:13986
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/config job_size:14829
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/build job_size:14120
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/test job_size:14950
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/add_write_perm job_size:14668
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/install job_size:14784
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/install_log job_size:18564
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/remove_write_perm job_size:14707
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/module_sync job_size:13672
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.53/wipe_build job_size:15242
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/var_summary job_size:15452
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/git_srcs job_size:15297
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/make_build_dir job_size:13986
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/config job_size:14829
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/build job_size:14120
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/test job_size:14950
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/add_write_perm job_size:14668
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/install job_size:14784
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/install_log job_size:18564
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/remove_write_perm job_size:14707
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/module_sync job_size:13672
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/gnu.61/wipe_build job_size:15242
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/var_summary job_size:15436
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/git_srcs job_size:15236
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/make_build_dir job_size:13964
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/config job_size:14813
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/build job_size:14110
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/test job_size:14940
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/add_write_perm job_size:14658
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/install job_size:14771
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/install_log job_size:18545
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/remove_write_perm job_size:14697
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/module_sync job_size:13665
-LOG:[12:56:00 13.4.2017]  submitted: /odb/opensuse131/pgi/wipe_build job_size:15226
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/var_summary job_size:15351
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/git_srcs job_size:15094
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/make_build_dir job_size:13874
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/config job_size:14731
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/build job_size:14036
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/test job_size:14866
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/add_write_perm job_size:14584
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/install job_size:14693
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/install_log job_size:18456
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/remove_write_perm job_size:14623
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/module_sync job_size:13587
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.49/wipe_build job_size:15143
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/var_summary job_size:15375
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/git_srcs job_size:15118
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/make_build_dir job_size:13898
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/config job_size:14755
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/build job_size:14060
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/test job_size:14890
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/add_write_perm job_size:14608
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/install job_size:14717
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/install_log job_size:18480
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/remove_write_perm job_size:14647
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/module_sync job_size:13611
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/gnu.53/wipe_build job_size:15167
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/var_summary job_size:15359
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/git_srcs job_size:15057
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/make_build_dir job_size:13876
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/config job_size:14739
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/build job_size:14050
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/test job_size:14880
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/add_write_perm job_size:14598
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/install job_size:14704
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/install_log job_size:18461
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/remove_write_perm job_size:14637
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/module_sync job_size:13604
-LOG:[12:56:00 13.4.2017]  submitted: /odb/lxc/pgi/wipe_build job_size:15151
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/var_summary job_size:15378
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/git_srcs job_size:15148
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/make_build_dir job_size:13902
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/config job_size:14755
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/build job_size:14056
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/test job_size:14886
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/add_write_perm job_size:14604
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/install job_size:14715
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/install_log job_size:18485
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/remove_write_perm job_size:14643
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/module_sync job_size:13608
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.53/wipe_build job_size:15168
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/var_summary job_size:15402
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/git_srcs job_size:15172
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/make_build_dir job_size:13926
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/config job_size:14779
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/build job_size:14080
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/test job_size:14910
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/add_write_perm job_size:14628
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/install job_size:14739
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/install_log job_size:18509
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/remove_write_perm job_size:14667
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/module_sync job_size:13632
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/gnu.61/wipe_build job_size:15192
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/var_summary job_size:15386
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/git_srcs job_size:15111
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/make_build_dir job_size:13904
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/config job_size:14763
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/build job_size:14070
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/test job_size:14900
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/add_write_perm job_size:14618
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/install job_size:14726
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/install_log job_size:18490
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/remove_write_perm job_size:14657
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/module_sync job_size:13625
-LOG:[12:56:00 13.4.2017]  submitted: /odb/leap42/pgi/wipe_build job_size:15176
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/var_summary job_size:15317
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/git_srcs job_size:14985
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/make_build_dir job_size:13830
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/config job_size:14656
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/build job_size:14012
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/test job_size:14842
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/add_write_perm job_size:14519
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/install job_size:14623
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/install_log job_size:17966
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/remove_write_perm job_size:14558
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/module_sync job_size:13570
-LOG:[12:56:00 13.4.2017]  submitted: /odb/sappb/wipe_build job_size:15113
-WAR:[12:56:00 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/var_summary job_size:35830
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/git_srcs job_size:35733
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/make_build_dir job_size:34476
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/config job_size:35178
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/build job_size:34388
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/test job_size:35196
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/add_write_perm job_size:35106
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/install job_size:35074
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/install_log job_size:38640
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/remove_write_perm job_size:35211
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/module_sync job_size:34058
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.49/wipe_build job_size:35626
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/var_summary job_size:35830
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/git_srcs job_size:35733
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/make_build_dir job_size:34476
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/config job_size:35178
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/build job_size:34388
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/test job_size:35196
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/add_write_perm job_size:35106
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/install job_size:35074
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/install_log job_size:38640
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/remove_write_perm job_size:35211
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/module_sync job_size:34058
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/gnu.53/wipe_build job_size:35626
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/var_summary job_size:35895
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/git_srcs job_size:35828
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/make_build_dir job_size:34545
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/config job_size:35296
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/build job_size:34449
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/test job_size:35257
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/add_write_perm job_size:35167
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/install job_size:35137
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/install_log job_size:38707
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/remove_write_perm job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/module_sync job_size:34117
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.14/wipe_build job_size:35691
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/var_summary job_size:35895
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/git_srcs job_size:35828
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/make_build_dir job_size:34545
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/config job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/build job_size:34449
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/test job_size:35257
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/add_write_perm job_size:35167
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/install job_size:35137
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/install_log job_size:38707
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/remove_write_perm job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/module_sync job_size:34117
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.15/wipe_build job_size:35691
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/var_summary job_size:35871
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/git_srcs job_size:35804
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/make_build_dir job_size:34521
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/config job_size:35248
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/build job_size:34425
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/test job_size:35233
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/add_write_perm job_size:35143
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/install job_size:35113
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/install_log job_size:38683
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/remove_write_perm job_size:35248
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/module_sync job_size:34093
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/intel.16/wipe_build job_size:35667
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/var_summary job_size:35797
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/git_srcs job_size:35715
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/make_build_dir job_size:34445
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/config job_size:35173
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/build job_size:34353
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/test job_size:35161
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/add_write_perm job_size:35071
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/install job_size:35040
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/install_log job_size:38608
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/remove_write_perm job_size:35176
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/module_sync job_size:34022
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.84/wipe_build job_size:35593
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/var_summary job_size:35825
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/git_srcs job_size:35758
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/make_build_dir job_size:34475
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/config job_size:35201
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/build job_size:34379
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/test job_size:35187
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/add_write_perm job_size:35097
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/install job_size:35067
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/install_log job_size:38637
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/remove_write_perm job_size:35202
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/module_sync job_size:34047
-LOG:[12:56:00 13.4.2017]  submitted: /odb/cca/cray.846/wipe_build job_size:35621
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/var_summary job_size:35830
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/git_srcs job_size:35733
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/make_build_dir job_size:34476
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/config job_size:35178
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/build job_size:34388
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/test job_size:35196
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/add_write_perm job_size:35106
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/install job_size:35074
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/install_log job_size:38640
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/remove_write_perm job_size:35211
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/module_sync job_size:34058
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.49/wipe_build job_size:35626
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/var_summary job_size:35830
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/git_srcs job_size:35733
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/make_build_dir job_size:34476
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/config job_size:35178
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/build job_size:34388
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/test job_size:35196
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/add_write_perm job_size:35106
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/install job_size:35074
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/install_log job_size:38640
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/remove_write_perm job_size:35211
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/module_sync job_size:34058
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/gnu.53/wipe_build job_size:35626
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/var_summary job_size:35895
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/git_srcs job_size:35828
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/make_build_dir job_size:34545
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/config job_size:35296
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/build job_size:34449
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/test job_size:35257
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/add_write_perm job_size:35167
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/install job_size:35137
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/install_log job_size:38707
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/remove_write_perm job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/module_sync job_size:34117
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.14/wipe_build job_size:35691
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/var_summary job_size:35895
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/git_srcs job_size:35828
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/make_build_dir job_size:34545
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/config job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/build job_size:34449
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/test job_size:35257
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/add_write_perm job_size:35167
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/install job_size:35137
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/install_log job_size:38707
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/remove_write_perm job_size:35272
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/module_sync job_size:34117
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.15/wipe_build job_size:35691
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/var_summary job_size:35871
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/git_srcs job_size:35804
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/make_build_dir job_size:34521
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/config job_size:35248
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/build job_size:34425
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/test job_size:35233
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/add_write_perm job_size:35143
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/install job_size:35113
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/install_log job_size:38683
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/remove_write_perm job_size:35248
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/module_sync job_size:34093
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/intel.16/wipe_build job_size:35667
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/var_summary job_size:35797
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/git_srcs job_size:35715
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/make_build_dir job_size:34445
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/config job_size:35173
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/build job_size:34353
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/test job_size:35161
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/add_write_perm job_size:35071
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/install job_size:35040
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/install_log job_size:38608
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/remove_write_perm job_size:35176
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/module_sync job_size:34022
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.84/wipe_build job_size:35593
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/var_summary job_size:35825
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/git_srcs job_size:35758
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/make_build_dir job_size:34475
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/config job_size:35201
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/build job_size:34379
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/test job_size:35187
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/add_write_perm job_size:35097
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/install job_size:35067
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/install_log job_size:38637
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/remove_write_perm job_size:35202
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/module_sync job_size:34047
-LOG:[12:56:00 13.4.2017]  submitted: /odb/ccb/cray.846/wipe_build job_size:35621
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/regenerate job_size:15755
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/var_summary job_size:15787
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/git_srcs job_size:16038
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/make_build_dir job_size:14325
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/config job_size:15273
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/build job_size:14403
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/install job_size:15069
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/tests/archive job_size:15769
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/tests/bad_archive job_size:16438
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/tests/environment job_size:16373
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/itests/xperm/0 job_size:16189
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/itests/xperm/1 job_size:16189
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/itests/xperm/10 job_size:16197
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/install_log job_size:18495
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/remove_write_perm job_size:14979
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxop_dev/wipe_build job_size:15553
-WAR:[12:56:00 13.4.2017] EcfFile::doCreateJobFile: Too many files open(errno=EMFILE), include file cache size(44) Clearing cache. Check limits with ulimit -Sn
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/var_summary job_size:36580
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/git_srcs job_size:36808
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/make_build_dir job_size:35201
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/config job_size:36021
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/build job_size:35073
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/install job_size:35785
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/tests/archive job_size:36587
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/tests/bad_archive job_size:37344
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/tests/environment job_size:37279
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/itests/xperm/0 job_size:36994
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/itests/xperm/1 job_size:36994
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/itests/xperm/10 job_size:37024
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/install_log job_size:39290
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/remove_write_perm job_size:35913
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cck/wipe_build job_size:36346
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/var_summary job_size:36658
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/git_srcs job_size:36886
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/make_build_dir job_size:35279
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/config job_size:36114
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/build job_size:35151
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/install job_size:35863
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/tests/archive job_size:36665
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/tests/bad_archive job_size:37422
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/tests/environment job_size:37357
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/itests/xperm/0 job_size:37072
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/itests/xperm/1 job_size:37072
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/itests/xperm/10 job_size:37102
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/install_log job_size:39368
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/remove_write_perm job_size:35991
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cct/wipe_build job_size:36424
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/var_summary job_size:15718
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/git_srcs job_size:15855
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/make_build_dir job_size:14233
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/config job_size:15163
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/build job_size:14339
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/install job_size:14998
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/tests/archive job_size:15705
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/tests/bad_archive job_size:16374
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/tests/environment job_size:16309
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/itests/xperm/0 job_size:16125
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/itests/xperm/1 job_size:16125
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/itests/xperm/10 job_size:16133
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/install_log job_size:18419
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/remove_write_perm job_size:14915
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ecgb/wipe_build job_size:15470
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/var_summary job_size:15703
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/git_srcs job_size:15771
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/make_build_dir job_size:14201
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/config job_size:15135
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/build job_size:14323
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/install job_size:14978
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/tests/archive job_size:15689
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/tests/bad_archive job_size:16358
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/tests/environment job_size:16293
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/itests/xperm/0 job_size:16109
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/itests/xperm/1 job_size:16109
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/itests/xperm/10 job_size:16117
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/install_log job_size:18400
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/remove_write_perm job_size:14899
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxg/wipe_build job_size:15449
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/var_summary job_size:15789
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/git_srcs job_size:15959
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/make_build_dir job_size:14298
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/config job_size:15225
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/build job_size:14392
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/install job_size:15054
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/tests/archive job_size:15758
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/tests/bad_archive job_size:16427
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/tests/environment job_size:16362
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/itests/xperm/0 job_size:16178
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/itests/xperm/1 job_size:16178
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/itests/xperm/10 job_size:16186
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/install_log job_size:18493
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/remove_write_perm job_size:14968
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/opensuse131/wipe_build job_size:15533
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/var_summary job_size:15724
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/git_srcs job_size:15792
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/make_build_dir job_size:14222
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/config job_size:15226
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/build job_size:14344
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/install job_size:14999
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/tests/archive job_size:15710
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/tests/bad_archive job_size:16379
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/tests/environment job_size:16314
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/itests/xperm/0 job_size:16130
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/itests/xperm/1 job_size:16130
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/itests/xperm/10 job_size:16138
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/install_log job_size:18421
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/remove_write_perm job_size:14920
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/lxc/wipe_build job_size:15470
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/var_summary job_size:15734
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/git_srcs job_size:15829
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/make_build_dir job_size:14233
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/config job_size:15165
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/build job_size:14347
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/install job_size:15004
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/tests/archive job_size:15713
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/tests/bad_archive job_size:16382
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/tests/environment job_size:16317
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/itests/xperm/0 job_size:16133
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/itests/xperm/1 job_size:16133
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/itests/xperm/10 job_size:16141
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/install_log job_size:18433
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/remove_write_perm job_size:14923
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/leap42/wipe_build job_size:15478
-WAR:[12:56:00 13.4.2017] EcfFile::open_include_file: Too many files open(errno=EMFILE), Clearing cache, and trying again. Check limits with ulimit -Sn
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/var_summary job_size:36658
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/git_srcs job_size:36886
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/make_build_dir job_size:35279
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/config job_size:36114
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/build job_size:35151
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/install job_size:35863
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/tests/archive job_size:36665
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/tests/bad_archive job_size:37422
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/tests/environment job_size:37357
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/itests/xperm/0 job_size:37072
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/itests/xperm/1 job_size:37072
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/itests/xperm/10 job_size:37102
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/install_log job_size:39368
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/remove_write_perm job_size:35991
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/cca/wipe_build job_size:36424
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/var_summary job_size:36658
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/git_srcs job_size:36886
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/make_build_dir job_size:35279
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/config job_size:36114
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/build job_size:35151
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/install job_size:35863
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/tests/archive job_size:36665
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/tests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/tests/bad_archive job_size:37422
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/tests/environment job_size:37357
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/itests/xperm/0 job_size:37072
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/itests/xperm
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/itests
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/itests/xperm/1 job_size:37072
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/itests/xperm/10 job_size:37102
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/install_log job_size:39368
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/remove_write_perm job_size:35991
-LOG:[12:56:00 13.4.2017]  submitted: /mars_client_develop/ccb/wipe_build job_size:36424
diff --git a/Base/test/TestLoadDefsCmd.cpp b/Base/test/TestLoadDefsCmd.cpp
new file mode 100644
index 0000000..22ed9e5
--- /dev/null
+++ b/Base/test/TestLoadDefsCmd.cpp
@@ -0,0 +1,62 @@
+//============================================================================
+// Name        :
+// Author      : Avi
+// Revision    : $Revision: #23 $
+//
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not waive the 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 "MyDefsFixture.hpp"
+#include "PrintStyle.hpp"
+#include "File.hpp"
+#include "Ecf.hpp"
+#include "Pid.hpp"
+
+using namespace std;
+using namespace ecf;
+namespace fs = boost::filesystem;
+
+
+BOOST_AUTO_TEST_SUITE( BaseTestSuite )
+
+
+BOOST_AUTO_TEST_CASE( test_load_defs_cmd )
+{
+   cout << "Base:: ...test_load_defs_cmd \n";
+
+   MyDefsFixture fixtureDef ;
+   defs_ptr defs = fixtureDef.create_defs();
+
+   // save this defs as defs file format
+   std::string test_dir = File::test_data("Base/test","Base");
+   std::string defs_format = Pid::unique_name(test_dir + "/test_load_defs_cmd.def");
+   std::string boost_format = Pid::unique_name(test_dir + "/test_load_defs_cmd.check");
+
+   defs->save_as_checkpt(  defs_format );
+   defs->boost_save_as_checkpt(boost_format);
+
+   BOOST_CHECK_MESSAGE(fs::exists( defs_format  ),   defs_format << " file not created" );
+   BOOST_CHECK_MESSAGE(fs::exists(  boost_format  ), boost_format << " file not created" );
+
+   LoadDefsCmd load_as_defs_cmd(defs_format , false /* force */, false /* check_only */);
+   LoadDefsCmd load_as_boost_cmd( boost_format , false /* force */, false /* check_only */);
+
+   DebugEquality debug_equality; // only as affect in DEBUG build
+   BOOST_CHECK_MESSAGE(*load_as_defs_cmd.theDefs() == *load_as_boost_cmd.theDefs()," Expected boost and defs to be equal");
+
+   fs::remove( defs_format );
+   fs::remove( boost_format  );
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/Base/test/TestRequest.cpp b/Base/test/TestRequest.cpp
index 3a77633..3d3d86b 100644
--- a/Base/test/TestRequest.cpp
+++ b/Base/test/TestRequest.cpp
@@ -46,48 +46,49 @@ 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");
+   std::vector<std::string> suite_names; suite_names.push_back("suiteName");
    MyDefsFixture fixture;
    defs_ptr client_defs = fixture.create_defs();
+   client_defs->clear_externs(); // server defs should not have externs
 
-	// 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
+   // 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 ReplaceNodeCmd("suiteName",false,client_defs, true)));
+   cmd_vec.push_back( Cmd_ptr( new LoadDefsCmd(client_defs ,true/*force*/)));
    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 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 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::RELOAD_PASSWD_FILE)));
-	cmd_vec.push_back( Cmd_ptr( new CtsCmd(CtsCmd::FORCE_DEP_EVAL)));
+   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::RELOAD_PASSWD_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 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 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
@@ -95,197 +96,198 @@ static void populateCmdVec(std::vector<Cmd_ptr>& cmd_vec, std::vector<STC_Cmd_pt
    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::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::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 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"))  );
+   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 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::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::RELOAD_PASSWD_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::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 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::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)));
+   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(client_defs, true/*force*/))  );
+   theGroupCmd->addChild(  Cmd_ptr( new BeginCmd("suiteName"))  );
+   theGroupCmd->addChild(  Cmd_ptr( new BeginCmd("EmptySuite"))  );
+   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 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))  );
+   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 );
+   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");
-		}
-
-		ClientToServerRequest cmd_request;
-		cmd_request.set_cmd(theCmd);
-		{
-			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");
-	}
+   Defs* fixtureDefs = const_cast<Defs*>(&theFixtureDefs);
+   fixtureDefs->clear_externs();       // server does not have externs
+   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");
+      }
+
+      ClientToServerRequest cmd_request;
+      cmd_request.set_cmd(theCmd);
+      {
+         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());
+   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() );
+   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 )
@@ -303,16 +305,16 @@ BOOST_AUTO_TEST_CASE( test_all_request_persistence_text )
 
 BOOST_AUTO_TEST_CASE( test_request_authenticate )
 {
-	cout << "Base:: ...test_request_authenticate\n";
+   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 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);
+   // 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();
+   /// Destroy System singleton to avoid valgrind from complaining
+   System::destroy();
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/Base/test/TestRequeueNodeCmd.cpp b/Base/test/TestRequeueNodeCmd.cpp
index fbb4558..446050d 100644
--- a/Base/test/TestRequeueNodeCmd.cpp
+++ b/Base/test/TestRequeueNodeCmd.cpp
@@ -177,8 +177,7 @@ BOOST_AUTO_TEST_CASE( test_ecflow_359 )
    task_ptr complete = f1->add_task("complete");
    complete->addDefStatus( DState::COMPLETE);
 
-//   PrintStyle::setStyle(PrintStyle::STATE);
-//   cout << the_defs;
+//   PrintStyle style(PrintStyle::STATE); cout << the_defs;
 
    the_defs->beginAll();
 
@@ -221,8 +220,7 @@ BOOST_AUTO_TEST_CASE( test_ecflow_428 )
    task_ptr t1 = f2->add_task("t1");
    task_ptr t2 = f2->add_task("t2");
 
-//   PrintStyle::setStyle(PrintStyle::STATE);
-//   cout << the_defs;
+//   PrintStyle style(PrintStyle::STATE); cout << the_defs;
 
    the_defs->beginAll();
 
diff --git a/Base/test/TestSSyncCmd.cpp b/Base/test/TestSSyncCmd.cpp
index b92157e..bee4ab3 100644
--- a/Base/test/TestSSyncCmd.cpp
+++ b/Base/test/TestSSyncCmd.cpp
@@ -59,9 +59,9 @@ static void test_sync_scaffold(
 	server_reply.set_client_defs(  client_defs );
 
 
-	Ecf::set_debug_equality(true); // only has affect in DEBUG build
+   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);
+   Ecf::set_debug_equality(false); // only has affect in DEBUG build
 
 	// Get change number before any changes
 	unsigned int client_state_change_no = Ecf::state_change_no();
@@ -94,7 +94,7 @@ static void test_sync_scaffold(
 	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);
+   DebugEquality debug_equality;  // only has affect in DEBUG build
 	BOOST_CHECK_MESSAGE( *server_defs == *server_reply.client_defs(),"Test:" << test_name << ": Server and client should be same after sync" );
 //	if (! (*server_defs == *server_reply.client_defs()) ) {
 //	   cout << "Server====================================================================\n";
@@ -102,7 +102,6 @@ static void test_sync_scaffold(
 //    cout << "Client====================================================================\n";
 //    cout << server_reply.client_defs();
 //	}
-	Ecf::set_debug_equality(false);
 }
 
 // The modifiers
diff --git a/Base/test/TestSSyncCmdOrder.cpp b/Base/test/TestSSyncCmdOrder.cpp
index 18a1dbe..ce5fed8 100644
--- a/Base/test/TestSSyncCmdOrder.cpp
+++ b/Base/test/TestSSyncCmdOrder.cpp
@@ -17,7 +17,6 @@
 
 #include "ClientToServerCmd.hpp"
 #include "ServerToClientCmd.hpp"
-#include "MyDefsFixture.hpp"
 #include "MockServer.hpp"
 #include "TestHelper.hpp"
 #include "SSyncCmd.hpp"
@@ -97,7 +96,7 @@ static void test_sync_scaffold( defs_change_cmd the_defs_change_command,
 
    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);
+   Ecf::set_debug_equality(false); // only has affect in DEBUG build
 
    // Get change number before any changes
    Ecf::set_state_change_no(0);
@@ -126,10 +125,9 @@ static void test_sync_scaffold( defs_change_cmd the_defs_change_command,
    BOOST_CHECK_MESSAGE( server_reply.in_sync(),      "Expected to be in sync");
    BOOST_CHECK_MESSAGE( server_reply.full_sync() == full_sync, "Expected full sync");
 
+   DebugEquality debug_equality;  // only has affect in DEBUG build
    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());
diff --git a/Base/test/TestSSyncCmd_CH1.cpp b/Base/test/TestSSyncCmd_CH1.cpp
index 2e88fb5..6685d58 100644
--- a/Base/test/TestSSyncCmd_CH1.cpp
+++ b/Base/test/TestSSyncCmd_CH1.cpp
@@ -17,7 +17,6 @@
 
 #include "ClientToServerCmd.hpp"
 #include "ServerToClientCmd.hpp"
-#include "MyDefsFixture.hpp"
 #include "MockServer.hpp"
 #include "TestHelper.hpp"
 #include "SSyncCmd.hpp"
@@ -68,7 +67,7 @@ static defs_ptr create_server_defs()
    // 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");
+   ServerState::setup_default_server_variables(server_variables,"3141");
    defs->set_server().set_server_variables(server_variables);
 
    // ensure client/server start out the same
@@ -92,7 +91,7 @@ void test_sync_scaffold( defs_change_cmd the_defs_change_command, const std::str
                         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);
+   Ecf::set_debug_equality(false); // only has affect in DEBUG build
 
    // set handle and change numbers, before any changes
    Ecf::set_state_change_no(0);
@@ -121,9 +120,7 @@ void test_sync_scaffold( defs_change_cmd the_defs_change_command, const std::str
       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);
@@ -133,10 +130,8 @@ void test_sync_scaffold( defs_change_cmd the_defs_change_command, const std::str
 
       /// 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");
       BOOST_CHECK_MESSAGE( server_defs->get_flag() == the_client_defs->get_flag(), test_name << ": Server flags do not match");
-      Ecf::set_debug_equality(false);
    }
 
    MockServer mock_server(server_defs);
@@ -150,9 +145,8 @@ void test_sync_scaffold( defs_change_cmd the_defs_change_command, const std::str
       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);
+         Ecf::set_debug_equality(true); // only has affect in DEBUG build
          BOOST_CHECK_MESSAGE( server_defs->server().compare(server_reply.client_defs()->server()),test_name << ": Server state does not match");
-         Ecf::set_debug_equality(false);
       }
 
       // * Note we expect client defs to fail invariant checking when doing a full sync with handles
@@ -638,11 +632,10 @@ BOOST_AUTO_TEST_CASE( test_ssync_full_sync_using_handle  )
    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
+   DebugEquality debug_equality; // only as 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;
diff --git a/CMAKE_failed_tests.txt b/CMAKE_failed_tests.txt
deleted file mode 100644
index 0331220..0000000
--- a/CMAKE_failed_tests.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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/CMakeLists.txt b/CMakeLists.txt
index 99bc91b..a43c486 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -210,7 +210,11 @@ 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 regex)
+if ( ENABLE_PYTHON )
+	find_package( Boost 1.53.0 REQUIRED COMPONENTS python serialization system thread unit_test_framework test_exec_monitor filesystem program_options date_time regex)
+else()
+	find_package( Boost 1.53.0 REQUIRED COMPONENTS serialization system thread unit_test_framework test_exec_monitor filesystem program_options date_time regex)
+endif()
 
 # Available boost lib should be referenced as:
 #
@@ -232,7 +236,6 @@ if (NOT "${CMAKE_PREFIX_PATH}" EQUAL "${_CMAKE_PREFIX_PATH_BACKUP}")
     ecbuild_debug("Resetting CMAKE_PREFIX_PATH to ${CMAKE_PREFIX_PATH}")
 endif()
 
-
 # =======================================================================
 # SSL
 # =======================================================================
@@ -267,13 +270,20 @@ if( CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]" )
 endif()
 
 # =========================================================================================
-# build source code
+# CLANG: /usr/local/include/boost/type_traits/is_base_and_derived.hpp:226:42: 
+#           fatal error: recursive template instantiation exceeded maximum depth of 256
 # =========================================================================================
+if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth=1024")
+endif()
+
 
+# =========================================================================================
+# build source code
+# =========================================================================================
 add_subdirectory( ACore )
 add_subdirectory( ANattr )
 add_subdirectory( ANode )
-add_subdirectory( AParser )
 add_subdirectory( Base )
 add_subdirectory( CSim )
 add_subdirectory( Client )
@@ -309,12 +319,24 @@ endif()
 # =========================================================================================
 
 ecbuild_dont_pack( DIRS 
+                    .settings
+                    bamboo
                    	ACore/doc ANattr/doc ANode/doc Client/doc CSim/doc Pyext/doc Server/doc
                    	ecbuild
+                   	Pyext/test/data/CUSTOMER
                     SCRATCH
                     CUSTOMER 
                     build_scripts/nightly build_scripts/test_bench
-                    Doc/func_spec Doc/misc Doc/New_viewer Doc/newsletter Doc/online Doc/presentations Doc/tac
+                    Doc
+)
+
+# ignore eclipse files
+ecbuild_dont_pack( FILES 
+                   .project
+                   .cproject
+                   .pydevproject
+                   Pyext/.pydevproject
+                   build_scripts/.pydevproject
 )
 
 
diff --git a/CSim/CMakeLists.txt b/CSim/CMakeLists.txt
index 8e50557..d5cd74d 100644
--- a/CSim/CMakeLists.txt
+++ b/CSim/CMakeLists.txt
@@ -10,12 +10,11 @@ ecbuild_add_library( TARGET   libsimu
                      NOINSTALL
                      TYPE     STATIC
                      SOURCES  ${srcs}
-                     LIBS     libparser node nodeattr core    
+                     LIBS     node nodeattr core    
                      INCLUDES src
                               ../ACore/src 
                               ../ANattr/src
                               ../ANode/src
-                              ../AParser/src
                               ../Base/src
                     )
 
diff --git a/CSim/jamfile.jam b/CSim/jamfile.jam
index c10ab61..647b5bc 100644
--- a/CSim/jamfile.jam
+++ b/CSim/jamfile.jam
@@ -17,8 +17,7 @@ project theSimulator ;
 #
 use-project theCore     : ../ACore ;
 use-project theNodeAttr : ../ANattr ;
-use-project theNode     : ../ANode ;
-use-project theParser   : ../AParser ;
+use-project theNode     : ../ANode ;  
 use-project theBase     : ../Base ;
 
 lib pthread ;
@@ -33,7 +32,6 @@ 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
@@ -41,7 +39,6 @@ lib libsimu : [ glob src/*.cpp ]
                 <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
@@ -51,7 +48,6 @@ lib libsimu : [ glob src/*.cpp ]
               : <include>../CSim/src         
               ;
             
-
 #
 # Test for simulator
 # IMPORTANT: server *MUST* not link with client or include any of the client code
@@ -61,7 +57,6 @@ exe c_csim : [ glob test/*.cpp : test/TestSingleSimulator.cpp ]
              /theCore//core
              /theNodeAttr//nodeattr
              /theNode//node
-             /theParser//libparser
              /theBase//base
              libsimu
              /site-config//boost_system
@@ -82,7 +77,6 @@ exe c_csim_single : [ glob test/TestSingleSimulator.cpp test/TestUtil.cpp ]
              /theCore//core
              /theNodeAttr//nodeattr
              /theNode//node
-             /theParser//libparser
              /theBase//base
              libsimu
              /site-config//boost_system
diff --git a/CSim/src/AstAnalyserVisitor.cpp b/CSim/src/AstAnalyserVisitor.cpp
index 28d6a54..a7de8fa 100644
--- a/CSim/src/AstAnalyserVisitor.cpp
+++ b/CSim/src/AstAnalyserVisitor.cpp
@@ -54,6 +54,7 @@ void AstAnalyserVisitor::visitNode(AstNode* astNode)
 }
 
 void AstAnalyserVisitor::visitVariable(AstVariable* astVar){}
+void AstAnalyserVisitor::visitParentVariable(AstParentVariable* astVar){}
 
 void AstAnalyserVisitor::visitFlag(AstFlag* astVar)
 {
diff --git a/CSim/src/AstAnalyserVisitor.hpp b/CSim/src/AstAnalyserVisitor.hpp
index f16def0..8fdd109 100644
--- a/CSim/src/AstAnalyserVisitor.hpp
+++ b/CSim/src/AstAnalyserVisitor.hpp
@@ -55,6 +55,7 @@ public:
  	virtual void visitEventState(AstEventState*);
  	virtual void visitNode(AstNode*);
    virtual void visitVariable(AstVariable*);
+   virtual void visitParentVariable(AstParentVariable*);
    virtual void visitFlag(AstFlag*);
 
 private:
diff --git a/CSim/src/Simulator.cpp b/CSim/src/Simulator.cpp
index 411a0fe..6fea03e 100644
--- a/CSim/src/Simulator.cpp
+++ b/CSim/src/Simulator.cpp
@@ -24,7 +24,6 @@
 #include "Simulator.hpp"
 #include "Analyser.hpp"
 #include "SimulatorVisitor.hpp"
-#include "DefsStructureParser.hpp"
 #include "Defs.hpp"
 #include "Suite.hpp"
 #include "Family.hpp"
@@ -53,7 +52,7 @@ public:
 	~LogDestroyer() { Log::destroy(); }
 };
 
-Simulator::Simulator() : level_(0){}
+Simulator::Simulator() : level_(0), print_style_(PrintStyle::STATE){}
 
 bool Simulator::run(const std::string& theDefsFile,std::string& errorMsg) const
 {
@@ -62,9 +61,8 @@ bool Simulator::run(const std::string& theDefsFile,std::string& errorMsg) const
 #endif
 
    Defs theDefs;
-   DefsStructureParser checkPtParser( &theDefs , theDefsFile );
    std::string warningMsg;
-   if (!checkPtParser.doParse(errorMsg,warningMsg))  return false;
+   if (!theDefs.restore(theDefsFile,errorMsg,warningMsg))  return false;
    //cout << theDefs << "\n";
    return run(theDefs,theDefsFile,errorMsg, false /* don't do check, allready done */);
 }
@@ -204,7 +202,7 @@ void Simulator::run_analyser(Defs& theDefs,std::string& errorMsg ) const
    analyser.run(theDefs);
    errorMsg += "Please see files .flat and .depth for analysis\n";
 
-   PrintStyle::setStyle(PrintStyle::MIGRATE);
+   PrintStyle style(PrintStyle::MIGRATE);
    std::stringstream ss;
    ss << theDefs;
    errorMsg += ss.str();
diff --git a/CSim/src/Simulator.hpp b/CSim/src/Simulator.hpp
index 23b1816..e19a4be 100644
--- a/CSim/src/Simulator.hpp
+++ b/CSim/src/Simulator.hpp
@@ -20,6 +20,9 @@
 #include <boost/date_time/posix_time/posix_time_types.hpp>
 #include <string>
 #include <map>
+
+#include "PrintStyle.hpp"
+
 class Defs;
 class Task;
 class Submittable;
@@ -57,6 +60,7 @@ private:
 
 	mutable std::map<Submittable*,int> taskIntMap_;
 	mutable int level_;
+	PrintStyle print_style_;   // by default show state when writing defs to standard out. RAII
 };
 }
 #endif /* SIMULATOR_HPP_ */
diff --git a/CSim/test/TestRepeat.cpp b/CSim/test/TestRepeat.cpp
index dbc2599..c7101e9 100644
--- a/CSim/test/TestRepeat.cpp
+++ b/CSim/test/TestRepeat.cpp
@@ -77,7 +77,6 @@ BOOST_AUTO_TEST_CASE( test_repeat_integer  )
  	   //		cout << theDefs << "\n";
  	}
 
- 	PrintStyle::setStyle(PrintStyle::STATE);
  	Simulator simulator;
  	std::string errorMsg;
  	BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_repeat_integer.def"),errorMsg),errorMsg << "\n" << theDefs);
@@ -475,8 +474,6 @@ BOOST_AUTO_TEST_CASE( test_repeat_string )
       BOOST_REQUIRE_MESSAGE(repeat.last_valid_value() == 1,"Expected to find repeat with last valid value 1 but found " << repeat.last_valid_value() );
  	}
 
-   PrintStyle::setStyle(PrintStyle::DEFS);
-
    // remove generated log file. Comment out to debug
    std::string logFileName = TestUtil::testDataLocation("test_repeat_string.def") + ".log";
    fs::remove(logFileName);
diff --git a/CSim/test/TestToday.cpp b/CSim/test/TestToday.cpp
index 4a1d591..47750b2 100644
--- a/CSim/test/TestToday.cpp
+++ b/CSim/test/TestToday.cpp
@@ -20,7 +20,6 @@
 #include "Family.hpp"
 #include "Task.hpp"
 #include "TestUtil.hpp"
-#include "PrintStyle.hpp"
 
 #include <boost/test/unit_test.hpp>
 #include "boost/filesystem/operations.hpp"
@@ -165,7 +164,6 @@ BOOST_AUTO_TEST_CASE( test_today_time_and_date )
    std::string errorMsg;
    BOOST_CHECK_MESSAGE(simulator.run(theDefs,TestUtil::testDataLocation("test_today_time_and_date.def"),errorMsg),errorMsg);
 
-//   PrintStyle::setStyle(PrintStyle::MIGRATE);
 //   cout << theDefs;
 
    // remove generated log file. Comment out to debug
diff --git a/CSim/test/data/test_autoarchive_ast_node_reset.def.log b/CSim/test/data/test_autoarchive_ast_node_reset.def.log
index 0c62ff4..217ffd1 100644
--- a/CSim/test/data/test_autoarchive_ast_node_reset.def.log
+++ b/CSim/test/data/test_autoarchive_ast_node_reset.def.log
@@ -1,37 +1,37 @@
-LOG:[16:39:41 10.5.2017]  complete: /s1
-LOG:[16:39:41 10.5.2017]  queued: /s1/family
-LOG:[16:39:41 10.5.2017]  queued: /s1/family/t
-LOG:[16:39:41 10.5.2017]  queued: /s1/family/t2
-LOG:[16:39:41 10.5.2017]  complete: /s1/family
-LOG:[16:39:41 10.5.2017]  complete: /s1/family/t
-LOG:[16:39:41 10.5.2017]  complete: /s1/family/t2
-LOG:[16:39:41 10.5.2017]  queued: /s2
-LOG:[16:39:41 10.5.2017]  queued: /s2/family
-LOG:[16:39:41 10.5.2017]  queued: /s2/family/t
-LOG:[16:39:41 10.5.2017]  queued: /s3
-LOG:[16:39:41 10.5.2017]  queued: /s3/family
-LOG:[16:39:41 10.5.2017]  queued: /s3/family/t
-MSG:[16:39:41 10.5.2017]  time dependency(0) max_simulation_period(24:00:00) calendarIncrement(01:00:00)
-LOG:[16:39:41 10.5.2017]  submitted: /s2/family/t
-LOG:[16:39:41 10.5.2017]  submitted: /s2/family
-LOG:[16:39:41 10.5.2017]  submitted: /s2
-LOG:[16:39:41 10.5.2017]  submitted: /
-LOG:[16:39:41 10.5.2017]  active: /s2/family/t
-LOG:[16:39:41 10.5.2017]  active: /s2/family
-LOG:[16:39:41 10.5.2017]  active: /s2
-LOG:[16:39:41 10.5.2017]  active: /
-LOG:[16:39:41 10.5.2017]  submitted: /s3/family/t
-LOG:[16:39:41 10.5.2017]  submitted: /s3/family
-LOG:[16:39:41 10.5.2017]  submitted: /s3
-LOG:[16:39:41 10.5.2017]  active: /s3/family/t
-LOG:[16:39:41 10.5.2017]  active: /s3/family
-LOG:[16:39:41 10.5.2017]  active: /s3
-LOG:[16:39:41 10.5.2017]  complete: /s2/family/t
-LOG:[16:39:41 10.5.2017]  complete: /s2/family
-LOG:[16:39:41 10.5.2017]  complete: /s2
-LOG:[16:39:41 10.5.2017]  complete: /s3/family/t
-LOG:[16:39:41 10.5.2017]  complete: /s3/family
-LOG:[16:39:41 10.5.2017]  complete: /s3
-LOG:[16:39:41 10.5.2017]  complete: /
-MSG:[16:39:41 10.5.2017] autoarchive SUITE:/s2
-MSG:[16:39:41 10.5.2017] autoarchive SUITE:/s3
+LOG:[16:08:37 2.10.2017]  complete: /s1
+LOG:[16:08:37 2.10.2017]  queued: /s1/family
+LOG:[16:08:37 2.10.2017]  queued: /s1/family/t
+LOG:[16:08:37 2.10.2017]  queued: /s1/family/t2
+LOG:[16:08:37 2.10.2017]  complete: /s1/family
+LOG:[16:08:37 2.10.2017]  complete: /s1/family/t
+LOG:[16:08:37 2.10.2017]  complete: /s1/family/t2
+LOG:[16:08:37 2.10.2017]  queued: /s2
+LOG:[16:08:37 2.10.2017]  queued: /s2/family
+LOG:[16:08:37 2.10.2017]  queued: /s2/family/t
+LOG:[16:08:37 2.10.2017]  queued: /s3
+LOG:[16:08:37 2.10.2017]  queued: /s3/family
+LOG:[16:08:37 2.10.2017]  queued: /s3/family/t
+MSG:[16:08:37 2.10.2017]  time dependency(0) max_simulation_period(24:00:00) calendarIncrement(01:00:00)
+LOG:[16:08:37 2.10.2017]  submitted: /s2/family/t
+LOG:[16:08:37 2.10.2017]  submitted: /s2/family
+LOG:[16:08:37 2.10.2017]  submitted: /s2
+LOG:[16:08:37 2.10.2017]  submitted: /
+LOG:[16:08:37 2.10.2017]  active: /s2/family/t
+LOG:[16:08:37 2.10.2017]  active: /s2/family
+LOG:[16:08:37 2.10.2017]  active: /s2
+LOG:[16:08:37 2.10.2017]  active: /
+LOG:[16:08:37 2.10.2017]  submitted: /s3/family/t
+LOG:[16:08:37 2.10.2017]  submitted: /s3/family
+LOG:[16:08:37 2.10.2017]  submitted: /s3
+LOG:[16:08:37 2.10.2017]  active: /s3/family/t
+LOG:[16:08:37 2.10.2017]  active: /s3/family
+LOG:[16:08:37 2.10.2017]  active: /s3
+LOG:[16:08:37 2.10.2017]  complete: /s2/family/t
+LOG:[16:08:37 2.10.2017]  complete: /s2/family
+LOG:[16:08:37 2.10.2017]  complete: /s2
+LOG:[16:08:37 2.10.2017]  complete: /s3/family/t
+LOG:[16:08:37 2.10.2017]  complete: /s3/family
+LOG:[16:08:37 2.10.2017]  complete: /s3
+LOG:[16:08:37 2.10.2017]  complete: /
+MSG:[16:08:37 2.10.2017] autoarchive SUITE:/s2
+MSG:[16:08:37 2.10.2017] autoarchive SUITE:/s3
diff --git a/CSim/test/data/test_autoarchive_family.def.log b/CSim/test/data/test_autoarchive_family.def.log
index 54b82f1..fb61be5 100644
--- a/CSim/test/data/test_autoarchive_family.def.log
+++ b/CSim/test/data/test_autoarchive_family.def.log
@@ -1,43 +1,43 @@
-LOG:[16:39:41 10.5.2017]  queued: /test_autoarchive_family
-LOG:[16:39:41 10.5.2017]  queued: /test_autoarchive_family/family
-LOG:[16:39:41 10.5.2017]  queued: /test_autoarchive_family/family/t
-LOG:[16:39:41 10.5.2017]  queued: /test_autoarchive_1_2_hours_real
-LOG:[16:39:41 10.5.2017]  queued: /test_autoarchive_1_2_hours_real/family
-LOG:[16:39:41 10.5.2017]  queued: /test_autoarchive_1_2_hours_real/family/t
-LOG:[16:39:41 10.5.2017]  queued: /test_autoarchive_1_2_day_relative
-LOG:[16:39:41 10.5.2017]  queued: /test_autoarchive_1_2_day_relative/family
-LOG:[16:39:41 10.5.2017]  queued: /test_autoarchive_1_2_day_relative/family/t
-MSG:[16:39:41 10.5.2017]  time dependency(0) max_simulation_period(48:00:00) calendarIncrement(01:00:00)
-LOG:[16:39:41 10.5.2017]  submitted: /test_autoarchive_family/family/t
-LOG:[16:39:41 10.5.2017]  submitted: /test_autoarchive_family/family
-LOG:[16:39:41 10.5.2017]  submitted: /test_autoarchive_family
-LOG:[16:39:41 10.5.2017]  submitted: /
-LOG:[16:39:41 10.5.2017]  active: /test_autoarchive_family/family/t
-LOG:[16:39:41 10.5.2017]  active: /test_autoarchive_family/family
-LOG:[16:39:41 10.5.2017]  active: /test_autoarchive_family
-LOG:[16:39:41 10.5.2017]  active: /
-LOG:[16:39:41 10.5.2017]  submitted: /test_autoarchive_1_2_hours_real/family/t
-LOG:[16:39:41 10.5.2017]  submitted: /test_autoarchive_1_2_hours_real/family
-LOG:[16:39:41 10.5.2017]  submitted: /test_autoarchive_1_2_hours_real
-LOG:[16:39:41 10.5.2017]  active: /test_autoarchive_1_2_hours_real/family/t
-LOG:[16:39:41 10.5.2017]  active: /test_autoarchive_1_2_hours_real/family
-LOG:[16:39:41 10.5.2017]  active: /test_autoarchive_1_2_hours_real
-LOG:[16:39:41 10.5.2017]  submitted: /test_autoarchive_1_2_day_relative/family/t
-LOG:[16:39:41 10.5.2017]  submitted: /test_autoarchive_1_2_day_relative/family
-LOG:[16:39:41 10.5.2017]  submitted: /test_autoarchive_1_2_day_relative
-LOG:[16:39:41 10.5.2017]  active: /test_autoarchive_1_2_day_relative/family/t
-LOG:[16:39:41 10.5.2017]  active: /test_autoarchive_1_2_day_relative/family
-LOG:[16:39:41 10.5.2017]  active: /test_autoarchive_1_2_day_relative
-LOG:[16:39:41 10.5.2017]  complete: /test_autoarchive_family/family/t
-LOG:[16:39:41 10.5.2017]  complete: /test_autoarchive_family/family
-LOG:[16:39:41 10.5.2017]  complete: /test_autoarchive_family
-LOG:[16:39:41 10.5.2017]  complete: /test_autoarchive_1_2_hours_real/family/t
-LOG:[16:39:41 10.5.2017]  complete: /test_autoarchive_1_2_hours_real/family
-LOG:[16:39:41 10.5.2017]  complete: /test_autoarchive_1_2_hours_real
-LOG:[16:39:41 10.5.2017]  complete: /test_autoarchive_1_2_day_relative/family/t
-LOG:[16:39:41 10.5.2017]  complete: /test_autoarchive_1_2_day_relative/family
-LOG:[16:39:41 10.5.2017]  complete: /test_autoarchive_1_2_day_relative
-LOG:[16:39:41 10.5.2017]  complete: /
-MSG:[16:39:41 10.5.2017] autoarchive FAMILY:/test_autoarchive_1_2_hours_real/family
-MSG:[16:39:41 10.5.2017] autoarchive FAMILY:/test_autoarchive_family/family
-MSG:[16:39:41 10.5.2017] autoarchive FAMILY:/test_autoarchive_1_2_day_relative/family
+LOG:[16:08:37 2.10.2017]  queued: /test_autoarchive_family
+LOG:[16:08:37 2.10.2017]  queued: /test_autoarchive_family/family
+LOG:[16:08:37 2.10.2017]  queued: /test_autoarchive_family/family/t
+LOG:[16:08:37 2.10.2017]  queued: /test_autoarchive_1_2_hours_real
+LOG:[16:08:37 2.10.2017]  queued: /test_autoarchive_1_2_hours_real/family
+LOG:[16:08:37 2.10.2017]  queued: /test_autoarchive_1_2_hours_real/family/t
+LOG:[16:08:37 2.10.2017]  queued: /test_autoarchive_1_2_day_relative
+LOG:[16:08:37 2.10.2017]  queued: /test_autoarchive_1_2_day_relative/family
+LOG:[16:08:37 2.10.2017]  queued: /test_autoarchive_1_2_day_relative/family/t
+MSG:[16:08:37 2.10.2017]  time dependency(0) max_simulation_period(48:00:00) calendarIncrement(01:00:00)
+LOG:[16:08:37 2.10.2017]  submitted: /test_autoarchive_family/family/t
+LOG:[16:08:37 2.10.2017]  submitted: /test_autoarchive_family/family
+LOG:[16:08:37 2.10.2017]  submitted: /test_autoarchive_family
+LOG:[16:08:37 2.10.2017]  submitted: /
+LOG:[16:08:37 2.10.2017]  active: /test_autoarchive_family/family/t
+LOG:[16:08:37 2.10.2017]  active: /test_autoarchive_family/family
+LOG:[16:08:37 2.10.2017]  active: /test_autoarchive_family
+LOG:[16:08:37 2.10.2017]  active: /
+LOG:[16:08:37 2.10.2017]  submitted: /test_autoarchive_1_2_hours_real/family/t
+LOG:[16:08:37 2.10.2017]  submitted: /test_autoarchive_1_2_hours_real/family
+LOG:[16:08:37 2.10.2017]  submitted: /test_autoarchive_1_2_hours_real
+LOG:[16:08:37 2.10.2017]  active: /test_autoarchive_1_2_hours_real/family/t
+LOG:[16:08:37 2.10.2017]  active: /test_autoarchive_1_2_hours_real/family
+LOG:[16:08:37 2.10.2017]  active: /test_autoarchive_1_2_hours_real
+LOG:[16:08:37 2.10.2017]  submitted: /test_autoarchive_1_2_day_relative/family/t
+LOG:[16:08:37 2.10.2017]  submitted: /test_autoarchive_1_2_day_relative/family
+LOG:[16:08:37 2.10.2017]  submitted: /test_autoarchive_1_2_day_relative
+LOG:[16:08:37 2.10.2017]  active: /test_autoarchive_1_2_day_relative/family/t
+LOG:[16:08:37 2.10.2017]  active: /test_autoarchive_1_2_day_relative/family
+LOG:[16:08:37 2.10.2017]  active: /test_autoarchive_1_2_day_relative
+LOG:[16:08:37 2.10.2017]  complete: /test_autoarchive_family/family/t
+LOG:[16:08:37 2.10.2017]  complete: /test_autoarchive_family/family
+LOG:[16:08:37 2.10.2017]  complete: /test_autoarchive_family
+LOG:[16:08:37 2.10.2017]  complete: /test_autoarchive_1_2_hours_real/family/t
+LOG:[16:08:37 2.10.2017]  complete: /test_autoarchive_1_2_hours_real/family
+LOG:[16:08:37 2.10.2017]  complete: /test_autoarchive_1_2_hours_real
+LOG:[16:08:37 2.10.2017]  complete: /test_autoarchive_1_2_day_relative/family/t
+LOG:[16:08:37 2.10.2017]  complete: /test_autoarchive_1_2_day_relative/family
+LOG:[16:08:37 2.10.2017]  complete: /test_autoarchive_1_2_day_relative
+LOG:[16:08:37 2.10.2017]  complete: /
+MSG:[16:08:37 2.10.2017] autoarchive FAMILY:/test_autoarchive_1_2_hours_real/family
+MSG:[16:08:37 2.10.2017] autoarchive FAMILY:/test_autoarchive_family/family
+MSG:[16:08:37 2.10.2017] autoarchive FAMILY:/test_autoarchive_1_2_day_relative/family
diff --git a/Client/CMakeLists.txt b/Client/CMakeLists.txt
index 8538914..1a59dfc 100644
--- a/Client/CMakeLists.txt
+++ b/Client/CMakeLists.txt
@@ -18,13 +18,12 @@ ecbuild_add_library( TARGET libclient
                      NOINSTALL
                      TYPE     STATIC
                      SOURCES  ${srcs}
-                     LIBS     base libparser node nodeattr core 
+                     LIBS     base node nodeattr core 
                               pthread
                      INCLUDES src
                               ../ACore/src 
                               ../ANattr/src
                               ../ANode/src
-                              ../AParser/src
                               ../Base/src
                               ../Base/src/cts
                               ../Base/src/stc
diff --git a/Client/Jamfile.jam b/Client/Jamfile.jam
index d6dc810..09c69d3 100644
--- a/Client/Jamfile.jam
+++ b/Client/Jamfile.jam
@@ -12,8 +12,7 @@ project theClient ;
 
 use-project theCore      : ../ACore ;
 use-project theNodeAttr  : ../ANattr ;
-use-project theNode      : ../ANode ;
-use-project theParser    : ../AParser ;
+use-project theNode      : ../ANode ;  
 use-project theBase      : ../Base ;
 
 #
@@ -21,7 +20,7 @@ use-project theBase      : ../Base ;
 # however if this is done, it will not link since, lpthread appears twice
 # on the link line
 #
-lib pthread  ;
+lib pthread ;
 
 #
 # define DEBUG_CLIENT for additional debug
@@ -39,13 +38,11 @@ lib libclient : [ glob src/*.cpp : src/*Main.cpp ]
                 <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
@@ -63,7 +60,6 @@ exe ecflow_client : [ glob src/*Main.cpp ]
              /theCore//core
              /theNodeAttr//nodeattr
              /theNode//node
-             /theParser//libparser
              /theBase//base
              libclient
              /site-config//boost_system
@@ -85,7 +81,6 @@ exe s_client : [ glob test/*.cpp : test/TestSinglePerf.cpp test/TestMigration.cp
            /theCore//core
            /theNodeAttr//nodeattr
            /theNode//node
-           /theParser//libparser
            /theBase//base
            libclient
            /site-config//boost_system
@@ -104,7 +99,6 @@ exe perf_test_large_defs : [ glob test/TestSinglePerf.cpp  ]   [ glob test/SCPor
            /theCore//core
            /theNodeAttr//nodeattr
            /theNode//node
-           /theParser//libparser
            /theBase//base
            libclient
            pthread
@@ -124,7 +118,6 @@ exe m_test_migration : [ glob test/TestMigration.cpp  ]   [ glob test/SCPort.cpp
            /theCore//core
            /theNodeAttr//nodeattr
            /theNode//node
-           /theParser//libparser
            /theBase//base
            libclient
            pthread
diff --git a/Client/src/ClientEnvironment.cpp b/Client/src/ClientEnvironment.cpp
index e5df1b5..649f2fd 100644
--- a/Client/src/ClientEnvironment.cpp
+++ b/Client/src/ClientEnvironment.cpp
@@ -281,6 +281,8 @@ void ClientEnvironment::read_environment_variables()
 		host_vec_.clear(); // remove previous setting if any
  		host_vec_.push_back(std::make_pair(host,port));
 	}
+   if (getenv(Str::ECF_NODE().c_str()))
+      cout << "Warning: ECF_NODE has been replaced with ECF_HOST. In future ecflow releases, ECF_NODE will be deprecated\n";
 
 	if (getenv("ECF_ALLOW_NEW_CLIENT_OLD_SERVER")) {
 	   env_ecf_new_client_old_server_ = getenv("ECF_ALLOW_NEW_CLIENT_OLD_SERVER");
diff --git a/Client/src/ClientEnvironment.hpp b/Client/src/ClientEnvironment.hpp
index 2ec00c6..2724c05 100644
--- a/Client/src/ClientEnvironment.hpp
+++ b/Client/src/ClientEnvironment.hpp
@@ -41,7 +41,7 @@ public:
 	/// 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
+	/// Allow pure 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
@@ -102,12 +102,18 @@ public:
    virtual void set_test() { under_test_ = true; }
    virtual bool under_test() const { return under_test_; }
 
+   // Support for python child commands, and python jobs
+   void set_child_path(const std::string& path) { task_path_ = path;}
+   void set_child_password(const std::string& pass) { jobs_password_ = pass;}
+   void set_child_pid(const std::string& pid) { remote_id_ = pid;}
+   void set_child_try_no(unsigned int try_no) { task_try_num_ = try_no;}
+
 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
+ 	unsigned int task_try_num_;         // ECF_TRYNO. The task try number. The number of times the job has been run
 	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
diff --git a/Client/src/ClientInvoker.cpp b/Client/src/ClientInvoker.cpp
index c088f20..df3050f 100644
--- a/Client/src/ClientInvoker.cpp
+++ b/Client/src/ClientInvoker.cpp
@@ -57,14 +57,14 @@ using namespace boost::posix_time;
 // class ClientInvoker
 ClientInvoker::ClientInvoker()
 : on_error_throw_exception_(true), test_(false),testInterface_(false),
-  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
+  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD)
 {
 	if (clientEnv_.debug()) cout << TimeStamp::now() << "ClientInvoker::ClientInvoker(): 1=================start=================\n";
 }
 
 ClientInvoker::ClientInvoker(const std::string& host_port)
 : on_error_throw_exception_(true), test_(false),testInterface_(false),
-  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
+  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD)
 {
    if (clientEnv_.debug()) cout << TimeStamp::now() << "ClientInvoker::ClientInvoker(): 2=================start=================\n";
    // assume format <host>:<port>
@@ -77,7 +77,7 @@ ClientInvoker::ClientInvoker(const std::string& host_port)
 
 ClientInvoker::ClientInvoker(const std::string& host, const std::string& port)
 : on_error_throw_exception_(true), test_(false),testInterface_(false),
-  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
+  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD)
 {
    if (clientEnv_.debug()) cout << TimeStamp::now() << "ClientInvoker::ClientInvoker(): 3=================start=================\n";
    set_host_port(host,port);
@@ -85,7 +85,7 @@ ClientInvoker::ClientInvoker(const std::string& host, const std::string& port)
 
 ClientInvoker::ClientInvoker(const std::string& host, int port)
 : on_error_throw_exception_(true), test_(false),testInterface_(false),
-  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD),child_task_try_no_(0)
+  connection_attempts_(2),retry_connection_period_(RETRY_CONNECTION_PERIOD)
 {
    if (clientEnv_.debug()) cout << TimeStamp::now() << "ClientInvoker::ClientInvoker(): 4=================start=================\n";
    set_host_port(host, boost::lexical_cast<std::string>(port));
@@ -119,7 +119,6 @@ int ClientInvoker::allow_new_client_old_server() const
 }
 
 void ClientInvoker::taskPath(const std::string& s) {
-	assert(!s.empty());
 	test_ = true;
 	clientEnv_.taskPath(s);
 }
@@ -449,12 +448,13 @@ int ClientInvoker::getDefs() const
 
 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 */
+         bool force,      /* true means overwrite suite of same name */
+         bool check_only, /* client side, true means don't send to server, just check only */
+         bool print       /* client side, print the defs */
 ) const
 {
-   if (testInterface_) return invoke(CtsApi::loadDefs(filePath,force,check_only));
-   Cmd_ptr cmd = LoadDefsCmd::create(filePath,force,check_only,&clientEnv_);
+   if (testInterface_) return invoke(CtsApi::loadDefs(filePath,force,check_only,print));
+   Cmd_ptr cmd = LoadDefsCmd::create(filePath,force,check_only,print,&clientEnv_);
    if (cmd) return invoke(cmd); // If check_only cmd will be empty
    return 0;
 }
@@ -1200,64 +1200,39 @@ int ClientInvoker::load_in_memory_defs( const defs_ptr& clientDefs, bool force)
 }
 
 
-// ==========================================================================
-// 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";
+      std::cout << "  child_task_path = '" << clientEnv_.task_path() << "'\n";
+      std::cout << "  child_task_password = '" << clientEnv_.jobs_password() << "'\n";
+      std::cout << "  child_task_pid = '" << clientEnv_.process_or_remote_id() << "'\n";
+      std::cout << "  child_task_try_no = " << clientEnv_.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");
+   if (clientEnv_.task_path().empty()) throw std::runtime_error("Child Path not set");
+   if (clientEnv_.jobs_password().empty()) throw std::runtime_error("Child password not set");
+   if (clientEnv_.process_or_remote_id().empty())  throw std::runtime_error("Child pid not set");
+   if (clientEnv_.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_  ) ) );
+   invoke( Cmd_ptr( new InitCmd(clientEnv_.task_path(), clientEnv_.jobs_password(), clientEnv_.process_or_remote_id(), clientEnv_.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  ) ) );
+   invoke( Cmd_ptr( new AbortCmd(clientEnv_.task_path(), clientEnv_.jobs_password(), clientEnv_.process_or_remote_id(), clientEnv_.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  ) ) );
+   invoke( Cmd_ptr( new EventCmd(clientEnv_.task_path(), clientEnv_.jobs_password(), clientEnv_.process_or_remote_id(), clientEnv_.task_try_no(),event_name_or_number  ) ) );
 }
 
 void ClientInvoker::child_meter(const std::string& meter_name, int meter_value)
@@ -1265,7 +1240,7 @@ 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  ) ) );
+   invoke( Cmd_ptr( new MeterCmd(clientEnv_.task_path(), clientEnv_.jobs_password(), clientEnv_.process_or_remote_id(), clientEnv_.task_try_no(),meter_name,meter_value  ) ) );
 }
 
 void ClientInvoker::child_label(const std::string& label_name, const std::string& label_value)
@@ -1273,21 +1248,21 @@ void ClientInvoker::child_label(const std::string& label_name, const std::string
    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  ) ) );
+   invoke( Cmd_ptr( new LabelCmd(clientEnv_.task_path(), clientEnv_.jobs_password(), clientEnv_.process_or_remote_id(), clientEnv_.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 ) ) );
+   invoke( Cmd_ptr( new CtsWaitCmd(clientEnv_.task_path(), clientEnv_.jobs_password(), clientEnv_.process_or_remote_id(), clientEnv_.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_  ) ) );
+   invoke( Cmd_ptr( new CompleteCmd(clientEnv_.task_path(), clientEnv_.jobs_password(), clientEnv_.process_or_remote_id(), clientEnv_.task_try_no()  ) ) );
 }
 
 // ==========================================================================
diff --git a/Client/src/ClientInvoker.hpp b/Client/src/ClientInvoker.hpp
index 3bb5c10..310f504 100644
--- a/Client/src/ClientInvoker.hpp
+++ b/Client/src/ClientInvoker.hpp
@@ -154,11 +154,12 @@ public:
 	   { 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 set_child_path(const std::string& path) { clientEnv_.set_child_path(path);}
+	void set_child_password(const std::string& pass) { clientEnv_.set_child_password(pass);}
+	void set_child_pid(const std::string& pid) { clientEnv_.set_child_pid(pid);}
+	void set_child_try_no(unsigned int try_no) { clientEnv_.set_child_try_no(try_no);}
+	void set_child_timeout(unsigned int seconds) { clientEnv_.set_child_cmd_timeout(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);
@@ -171,8 +172,9 @@ public:
 	// 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 */
+ 	               bool force = false,      /* true means overwrite suite of same name */
+                  bool check_only = false, /* client side only, true means don't send to server, just check only */
+                  bool print = false       /* client side only, print the defs */
  	) 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); }
@@ -338,11 +340,6 @@ private:
 	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
diff --git a/Client/test/InvokeServer.hpp b/Client/test/InvokeServer.hpp
index 091c510..38924ba 100644
--- a/Client/test/InvokeServer.hpp
+++ b/Client/test/InvokeServer.hpp
@@ -22,7 +22,6 @@
 #include "TestHelper.hpp"
 #include "ClientInvoker.hpp"
 #include "Str.hpp"
-#include "File.hpp"
 #include "EcfPortLock.hpp"
 #include "Host.hpp"
 
diff --git a/Client/test/SCPort.cpp b/Client/test/SCPort.cpp
index 193d26c..8a5b16c 100644
--- a/Client/test/SCPort.cpp
+++ b/Client/test/SCPort.cpp
@@ -33,31 +33,55 @@ int SCPort::thePort_ = 3161;
 int SCPort::thePort_ = 3142;
 #endif
 
+
 std::string SCPort::next()
 {
+   bool debug = false;
+   if ( getenv("ECF_DEBUG_TEST") ) debug = true;
+
+   if (debug) std::cout << "\nSCPort::next() : ";
+
+   // Allow parallel tests
+   char* ecf_port = getenv("TEST_ECF_PORT");
+   if ( ecf_port )  {
+      if (debug) std::cout << " seed_port=TEST_ECF_PORT=(" << ecf_port << ")";
+      std::string port = ecf_port;
+      try { thePort_ = boost::lexical_cast<int>(port);}
+      catch (...){ std::cout << "SCPort::next()  TEST_ECF_PORT(" << ecf_port  << ") not convertible to an integer\n";}
+   }
+
+
+   // This is used to test remote servers(or legacy server with new client). Here ECF_HOST=localhost in the test scripts
    std::string host = ClientEnvironment::hostSpecified();
-   if ( host == Str::LOCALHOST() ) {
+   if (debug) std::cout << " ECF_HOST('" << host << "')";
 
-      std::string port;
+   if ( host == Str::LOCALHOST() ) {
       char* ecf_port = getenv("ECF_PORT");
-      if ( ecf_port )  port = ecf_port;
-      if (!port.empty()) {
-
-         //std::cout << "SCPort::next() ECF_HOST(" << host << ") ECF_PORT(" << port << ")\n";
-         return port;
+      if ( ecf_port )  {
+         std::string port = ecf_port;
+         if (!port.empty()) {
+            if (debug) std::cout << " ECF_PORT('" << ecf_port << "')\n";
+            return port;
+         }
       }
+      if (debug) std::cout << " !!!!!! ERROR when ECF_HOST=localhost  EXPECTED ECF_PORT to be set !!!!!! ";
    }
 
-   return next_only();
+   if (debug) std::cout << "\n";
+   std::string the_port = next_only(debug);
+   if (debug) std::cout << " SCPort::next() returning free port=" << the_port << "\n";
+   return the_port;
 }
 
-std::string SCPort::next_only()
+std::string SCPort::next_only(bool debug)
 {
+   if (debug) std::cout << " SCPort::next_only : starting seed_port(" << thePort_ << ")\n";
+
    // Use a combination of local lock file, and pinging the server
-   while (!EcfPortLock::is_free(thePort_)) thePort_++;
+   while (!EcfPortLock::is_free(thePort_,debug)) thePort_++;
 
-   // std::cout << "SCPort::next() = " << thePort << "\n";
-   return ClientInvoker::find_free_port(thePort_);
+   if (debug) std::cout << " SCPort::next_only() seed_port(" << thePort_ << ")\n";
+   return ClientInvoker::find_free_port(thePort_,debug);
 }
 
 }
diff --git a/Client/test/SCPort.hpp b/Client/test/SCPort.hpp
index 7b3ed03..f63e349 100644
--- a/Client/test/SCPort.hpp
+++ b/Client/test/SCPort.hpp
@@ -31,7 +31,7 @@ public:
    static std::string next();
 
 	/// make sure we have a unique port, each time next_only() is called;
-   static std::string next_only();
+   static std::string next_only(bool debug = false);
 
 private:
 	SCPort();
diff --git a/Client/test/TestCheckPtDefsCmd.cpp b/Client/test/TestCheckPtDefsCmd.cpp
index 61b96c6..31fb5ba 100644
--- a/Client/test/TestCheckPtDefsCmd.cpp
+++ b/Client/test/TestCheckPtDefsCmd.cpp
@@ -25,6 +25,7 @@
 #include "SCPort.hpp"
 #include "Str.hpp"
 #include "File.hpp"
+#include "MyDefsFixture.hpp"
 
 namespace fs = boost::filesystem;
 using namespace std;
@@ -151,30 +152,29 @@ BOOST_AUTO_TEST_CASE( test_restore_from_check_pt_using_new_server )
       return;
    }
 
+   PrintStyle style(PrintStyle::STATE);
    std::string port = SCPort::next();
+
+   MyDefsFixture theDefsFixture; // make sure generated server variable use this port.
+   defs_ptr defs_to_be_check_pointed = theDefsFixture.create_defs(port);
+
+   BOOST_REQUIRE_MESSAGE(defs_to_be_check_pointed->suiteVec().size() >= 2,"expected at least 2 suites");
+
    {
-      // Start a new server. However make sure that on server exist we not delete check pt files
+      // Start a new server. However make sure that on server exit, 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.load(defs_to_be_check_pointed) == 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
+   // 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 */
@@ -185,7 +185,18 @@ BOOST_AUTO_TEST_CASE( test_restore_from_check_pt_using_new_server )
    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");
+
+   // To compare the defs, we need to massage theDefsFixture
+   // update server state to match server, and update flag, caused by restoreDefsFromCheckPt
+   defs_to_be_check_pointed->set_server().set_state(SState::HALTED);
+   defs_to_be_check_pointed->flag().set(ecf::Flag::MESSAGE);
+
+   // Specifically ignore server variables, as the port numbers are different( and therefore checkpt,log, etc will not match)
+   DebugEquality debug_equality; // only as affect in DEBUG build
+   DebugEquality::set_ignore_server_variables(true);
+
+   BOOST_CHECK_MESSAGE( *theClient.defs() == *defs_to_be_check_pointed,
+         "expected defs to be the same.\nServer defs:\n" << *theClient.defs() << "\nExpected defs:\n" << *defs_to_be_check_pointed);
 }
 
 BOOST_AUTO_TEST_CASE( test_check_pt_edit_history )
@@ -229,9 +240,56 @@ BOOST_AUTO_TEST_CASE( test_check_pt_edit_history )
 
    // 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
+   defs.restore(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()
 
+BOOST_AUTO_TEST_CASE( test_restore_from_check_pt_using_old_boost_format )
+{
+   // This test will first try to load the checkpoint file as a DEFS file, if that
+   // fails it should load the defs as a boost checkpoint file.
+
+   // This test relies on a NEW server invocation. Hence if ECF_HOST/remote server is used
+   // the test will will invalid. hence ignore.
+   if (!ClientEnvironment::hostSpecified().empty()) {
+      cout << "Client:: ...test_restore_from_check_pt_using_old_boost_format: ignoring test when ECF_HOST specified\n";
+      return;
+   }
+
+   // Start a new server.
+   std::string port = SCPort::next();
+   InvokeServer invokeServer("Client:: ...test_restore_from_check_pt_using_old_boost_format",
+         port,
+         false,  /* bool disable_job_generation = false */
+         true,   /* bool remove_checkpt_file_before_server_start = true */
+         false   /* SET to true to DEBUG.  bool remove_checkpt_file_after_server_exit = true */
+   );
+
+   // Save the MyDefsFixture as a boost checkpoint file.
+   Host host;
+   MyDefsFixture theDefsFixture(port); // make sure server variable use this port
+   theDefsFixture.defsfile_.boost_save_as_checkpt(host.ecf_checkpt_file(port));
+
+   // Now attempt to restore this boost checkpoint, from the server
+   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
+   BOOST_REQUIRE_MESSAGE( theClient.restoreDefsFromCheckPt() == 0,"Expected restoreDefsFromCheckPt succeed\n");
+   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");
+
+   // To compare the defs, we need to massage theDefsFixture
+   // update server state to match server, and update flag, caused by restoreDefsFromCheckPt
+   theDefsFixture.defsfile_.set_server().set_state(SState::HALTED);
+   theDefsFixture.defsfile_.flag().set(ecf::Flag::MESSAGE);
+
+   // Specifically ignore server variables when comparing defs
+   // ECF_PID etc( and therefore checkpt,log, etc will not match, server uses absolute paths,MyDefsFixture does not)
+   DebugEquality debug_equality; // only has affect in DEBUG build
+   DebugEquality::set_ignore_server_variables(true);
+
+   //PrintStyle style(PrintStyle::STATE);
+   //cout << theDefsFixture.defsfile_ << "\n";
+   BOOST_CHECK_MESSAGE( *theClient.defs() == theDefsFixture.defsfile_,"expected defs to be the same");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/Client/test/TestClientInterface.cpp b/Client/test/TestClientInterface.cpp
index dd3af04..cea8fb0 100644
--- a/Client/test/TestClientInterface.cpp
+++ b/Client/test/TestClientInterface.cpp
@@ -581,5 +581,48 @@ BOOST_AUTO_TEST_CASE( test_client_task_interface )
    BOOST_REQUIRE_MESSAGE( theClient.labelTask("label_name",labels) == 0,"--label should return 0\n" << theClient.errorMsg());
 }
 
+BOOST_AUTO_TEST_CASE( test_client_task_interface_for_fail )
+{
+   std::cout << "Client:: ...test_client_task_interface_for_fail" << 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_THROW( theClient.waitTask("a == "),std::runtime_error); //  --wait with a bad expression 'a == ' should fail
+   }
+   {  // No Jobs password expect exception.
+      ClientInvoker theClient ;
+      theClient.testInterface(); // stops submission to server
+      theClient.taskPath("/a/made/up/path");
+      theClient.set_jobs_password(""); // The password(ECF_PASS) will be READ from the environment. Hence set to empty here
+
+      BOOST_REQUIRE_THROW( theClient.initTask(Submittable::DUMMY_PROCESS_OR_REMOTE_ID()),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.abortTask("reason for abort"),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.eventTask("event_name"),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.meterTask("meter_name","20"),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.waitTask("a == complete"),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.completeTask(),std::runtime_error);
+      std::vector<std::string> labels; labels.push_back("test_client_task_interface");
+      BOOST_REQUIRE_THROW( theClient.labelTask("label_name",labels),std::runtime_error);
+   }
+   {  // No task path set expect exception
+      ClientInvoker theClient ;
+      theClient.testInterface(); // stops submission to server
+      theClient.set_jobs_password( Submittable::DUMMY_JOBS_PASSWORD() );
+      theClient.taskPath(""); // The task path(ECF_NAME) could read from the environment, hence clear here.
+
+      BOOST_REQUIRE_THROW( theClient.initTask(Submittable::DUMMY_PROCESS_OR_REMOTE_ID()),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.abortTask("reason for abort"),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.eventTask("event_name"),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.meterTask("meter_name","20"),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.waitTask("a == complete"),std::runtime_error);
+      BOOST_REQUIRE_THROW( theClient.completeTask(),std::runtime_error);
+      std::vector<std::string> labels; labels.push_back("test_client_task_interface");
+      BOOST_REQUIRE_THROW( theClient.labelTask("label_name",labels),std::runtime_error);
+   }
+}
+
 BOOST_AUTO_TEST_SUITE_END()
 
diff --git a/Client/test/TestClientTimeout.cpp b/Client/test/TestClientTimeout.cpp
index 518189e..71a0e0b 100644
--- a/Client/test/TestClientTimeout.cpp
+++ b/Client/test/TestClientTimeout.cpp
@@ -54,7 +54,7 @@
 //   ClientInvoker theClient(invokeServer.host(),invokeServer.port());
 //   theClient.set_timeout(1);
 //
-//    std::string path = File::test_data("AParser/test/data/single_defs/mega.def","AParser");
+//    std::string path = File::test_data("ANode/parser/test/data/single_defs/mega.def","parser");
 //   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
diff --git a/Client/test/TestFlagMigrate.cpp b/Client/test/TestFlagMigrate.cpp
index 0037c87..3b07368 100644
--- a/Client/test/TestFlagMigrate.cpp
+++ b/Client/test/TestFlagMigrate.cpp
@@ -103,7 +103,7 @@ BOOST_AUTO_TEST_CASE( test_flag_migrate )
    BOOST_REQUIRE_MESSAGE(theClient.checkPtDefs() == 0,CtsApi::checkPtDefs() << " failed should return 0\n" << theClient.errorMsg());
    {
       Defs defs;
-      defs.restore_from_checkpt(invokeServer.ecf_checkpt_file()); // make a data model change
+      defs.restore(invokeServer.ecf_checkpt_file()); // make a data model change
       std::vector<node_ptr> all_nodes; defs.get_all_nodes(all_nodes);
       BOOST_REQUIRE_MESSAGE(all_nodes.size() == expected_nodes  ,"Expected "  << expected_nodes << " nodes but found " << all_nodes.size());
    }
diff --git a/Client/test/TestJobGenOnly.cpp b/Client/test/TestJobGenOnly.cpp
index 10ab34d..dd7c44e 100644
--- a/Client/test/TestJobGenOnly.cpp
+++ b/Client/test/TestJobGenOnly.cpp
@@ -23,7 +23,6 @@
 #include <boost/timer.hpp>
 
 #include "Defs.hpp"
-#include "DefsStructureParser.hpp"
 #include "NodeAttr.hpp"
 #include "Suite.hpp"
 #include "Task.hpp"
@@ -69,9 +68,8 @@ BOOST_AUTO_TEST_CASE( test_jobgenonly )
 
 	// Load the defs file 'jobgenonly.def'
 	Defs theDefs;
- 	DefsStructureParser checkPtParser( &theDefs, defsFile );
 	std::string errorMsg,warningMsg;
-	BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),errorMsg);
+	BOOST_REQUIRE_MESSAGE(theDefs.restore(defsFile,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);
diff --git a/Client/test/TestLifeCycle.cpp b/Client/test/TestLifeCycle.cpp
index 1dd17a6..9e950ee 100644
--- a/Client/test/TestLifeCycle.cpp
+++ b/Client/test/TestLifeCycle.cpp
@@ -20,7 +20,6 @@
 #include "boost/progress.hpp"
 #include <boost/test/unit_test.hpp>
 
-#include "DefsStructureParser.hpp"
 #include "Defs.hpp"
 #include "Suite.hpp"
 #include "Family.hpp"
@@ -43,9 +42,8 @@ BOOST_AUTO_TEST_CASE( test_node_tree_lifecycle )
    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);
+	bool parse = defs.restore(path,errorMsg,warningMsg);
 	if (!parse)  std::cerr << errorMsg;
 	BOOST_CHECK(parse);
 
diff --git a/Client/test/TestLoadDefsCmd.cpp b/Client/test/TestLoadDefsCmd.cpp
index 884dd7c..aeaa13f 100644
--- a/Client/test/TestLoadDefsCmd.cpp
+++ b/Client/test/TestLoadDefsCmd.cpp
@@ -20,7 +20,6 @@
 #include "boost/filesystem/path.hpp"
 #include <boost/test/unit_test.hpp>
 
-#include "DefsStructureParser.hpp"
 #include "Defs.hpp"
 #include "Suite.hpp"
 #include "Family.hpp"
@@ -55,26 +54,23 @@ BOOST_AUTO_TEST_CASE( test_load_defs_cmd_handleRequest )
 	// 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);
+		bool parse = firstDefs->restore(firstDef,errorMsg,warningMsg);
  		BOOST_CHECK_MESSAGE(parse,"Parse failed. " << errorMsg);
+ 		firstDefs->clear_externs(); // server defs should not have externs.
 	}
 	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);
+		bool parse = secondDefs.restore(secondDef,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
@@ -89,8 +85,6 @@ BOOST_AUTO_TEST_CASE( test_load_defs_cmd_handleRequest )
 	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
diff --git a/Client/test/TestPlugCmd.cpp b/Client/test/TestPlugCmd.cpp
index 1cb5b60..1aa73b7 100644
--- a/Client/test/TestPlugCmd.cpp
+++ b/Client/test/TestPlugCmd.cpp
@@ -20,7 +20,6 @@
 #include "boost/filesystem/path.hpp"
 #include "boost/progress.hpp"
 
-#include "DefsStructureParser.hpp"
 #include "Defs.hpp"
 #include "Suite.hpp"
 #include "Family.hpp"
@@ -46,9 +45,8 @@ BOOST_AUTO_TEST_CASE( test_plug_cmd )
    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);
+	bool parse = defs.restore(path,errorMsg,warningMsg);
 	if (!parse)  std::cerr << errorMsg;
 	BOOST_CHECK(parse);
 
@@ -125,9 +123,8 @@ BOOST_AUTO_TEST_CASE( test_plug_cmd_with_handles )
    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);
+   bool parse = defs.restore(path,errorMsg,warningMsg);
    if (!parse)  std::cerr << errorMsg;
    BOOST_CHECK(parse);
 
diff --git a/Client/test/TestServer.cpp b/Client/test/TestServer.cpp
index a2b8b6b..2b61a7c 100644
--- a/Client/test/TestServer.cpp
+++ b/Client/test/TestServer.cpp
@@ -166,7 +166,7 @@ BOOST_AUTO_TEST_CASE( test_server_group_stress_test )
 
 	std::string groupRequest = CtsApi::to_string(CtsApi::delete_node());
 	groupRequest += ";";
-	groupRequest +=	CtsApi::to_string(CtsApi::loadDefs(path,true/*force*/,false /*check_only*/));
+	groupRequest +=	CtsApi::to_string(CtsApi::loadDefs(path,true/*force*/,false/*check_only*/,false/*print*/));
 	groupRequest += ";";
 	groupRequest += CtsApi::shutdownServer();
 	groupRequest += ";";
diff --git a/Client/test/TestSinglePerf.cpp b/Client/test/TestSinglePerf.cpp
index 5be1ddb..d1d299b 100644
--- a/Client/test/TestSinglePerf.cpp
+++ b/Client/test/TestSinglePerf.cpp
@@ -101,6 +101,25 @@ void time_load_and_downloads(
             cout << " Begin:               " << duration_timer.elapsed().total_milliseconds() << "ms" << endl;
          }
          {
+            cout << " Download(news_local):"; cout.flush();
+            ClientInvoker client_news(host,port);
+            DurationTimer duration_timer;
+            for(int i = 0; i < count; i++) {
+               if (i == 0 || i != 1) {
+                  client_news.news_local();
+                  switch (client_news.server_reply().get_news()) {
+                     case ServerReply::DO_FULL_SYNC: cout << "FULL ";break;
+                     case ServerReply::NEWS: cout << "NEWS ";break;
+                     case ServerReply::NO_NEWS: cout << "NO_NEWS ";break;
+                     case ServerReply::NO_DEFS: cout << "NO_DEFS ";break;
+                  }
+               }
+               else if (i == 1) client_news.sync_local();
+            }
+            cout << ": 1:news_local(),2:sync_local(),n:news_local with the new Client: "
+                 <<  duration_timer.elapsed().total_milliseconds() << "(ms)" << endl;
+         }
+         {
             cout << " Download(Sync):      "; cout.flush();
             for(int i = 0; i < count; i++) {
                DurationTimer duration_timer;
@@ -118,69 +137,80 @@ void time_load_and_downloads(
                ClientInvoker client(host,port);
                DurationTimer duration_timer;
                client.sync_local();
-               int seconds = duration_timer.elapsed().total_milliseconds();
-               cout << seconds << " ";
-               total += seconds;
+               int mil_secs = duration_timer.elapsed().total_milliseconds();
+               cout << mil_secs  << " ";
+               total += mil_secs;
             }
-            cout << ": Avg:" << (double)(total)/((double)count*1000) << "(sec)  : sync_local() with *different* clients. Uses Cache" << endl;
+            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):      "; cout.flush();
             double total = 0;
             for(int i = 0; i < count; i++) {
+               ClientInvoker client(host,port);
                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;
+            cout << ": Avg:" << (double)(total)/((double)count*1000) << "(sec)  : get_defs() from different 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 ??
-            }
+            for(size_t i = 0; i < all_tasks.size(); i++)  paths.push_back(all_tasks[i]->absNodePath());
+
             {
                cout << " Suspend " << paths.size() << " tasks : "; cout.flush();
                DurationTimer duration_timer;
                theClient.suspend(paths);
                cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000;
+               sync_and_news_local(theClient);
             }
-            sync_and_news_local(theClient);
             {
                cout << " Resume " << paths.size() << " tasks  : "; cout.flush();
                DurationTimer duration_timer;
                theClient.resume(paths);
                cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000;
+               sync_and_news_local(theClient);
+            }
+            {
+               cout << " check  " << paths.size() << " tasks  : "; cout.flush();
+               DurationTimer duration_timer;
+               theClient.check(paths);
+               cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000;
+               sync_and_news_local(theClient);
             }
-            sync_and_news_local(theClient);
             {
+               cout << " kill   " << paths.size() << " tasks  : "; cout.flush();
+               DurationTimer duration_timer;
+               theClient.kill(paths);
+               cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000;
+               sync_and_news_local(theClient);
+            }
+            {
+               // force complete on all tasks, on some suites(3199.def), can cause infinite recursion, i.e cause repeats to loop
+               // Hence we will call force aborted instead
                cout << " force  " << paths.size() << " tasks  : "; cout.flush();
                DurationTimer duration_timer;
-               theClient.force(paths,"complete");
+               theClient.force(paths,"aborted");
                cout << (double)duration_timer.elapsed().total_milliseconds()/(double)1000;
+               sync_and_news_local(theClient);
             }
-            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:            "; cout.flush();
             double total = 0;
             for(int i = 0; i < count; i++) {
                DurationTimer duration_timer;
                theClient.checkPtDefs();
                int seconds = duration_timer.elapsed().total_milliseconds();
-               cout << seconds << " "; cout.flush();
+               cout << seconds << " ";
                total += seconds;
             }
-            cout << ": Avg:" << (double)(total)/((double)count*1000) << "ms" << endl;
+            cout << ": Avg:" << (double)(total)/((double)count*1000) << "(sec)" << endl;
          }
          {
             DurationTimer duration_timer;
diff --git a/Client/test/TestUrlCmd.cpp b/Client/test/TestUrlCmd.cpp
index 96cf536..fe46ac0 100644
--- a/Client/test/TestUrlCmd.cpp
+++ b/Client/test/TestUrlCmd.cpp
@@ -20,7 +20,6 @@
 #include "boost/filesystem/path.hpp"
 #include <boost/test/unit_test.hpp>
 
-#include "DefsStructureParser.hpp"
 #include "Defs.hpp"
 #include "UrlCmd.hpp"
 #include "File.hpp"
@@ -41,9 +40,8 @@ BOOST_AUTO_TEST_CASE( test_url_cmd )
 
 	defs_ptr defs = Defs::create();
 
- 	DefsStructureParser checkPtParser( defs.get(), path );
 	std::string errorMsg,warningMsg;
-	bool parse = checkPtParser.doParse(errorMsg,warningMsg);
+	bool parse = defs->restore(path,errorMsg,warningMsg);
  	BOOST_CHECK_MESSAGE(parse,errorMsg);
 
  	// Check error conditions
diff --git a/Doc/.pydevproject b/Doc/.pydevproject
deleted file mode 100644
index a9cca03..0000000
--- a/Doc/.pydevproject
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?eclipse-pydev version="1.0"?>
-
-<pydev_project>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
-</pydev_project>
diff --git a/Doc/user-manual/client_options.docx b/Doc/user-manual/client_options.docx
deleted file mode 100644
index 4f90bc8..0000000
Binary files a/Doc/user-manual/client_options.docx and /dev/null differ
diff --git a/Doc/user-manual/user_manual.docx b/Doc/user-manual/user_manual.docx
deleted file mode 100644
index 789c28d..0000000
Binary files a/Doc/user-manual/user_manual.docx and /dev/null differ
diff --git a/Doc/user-manual/user_manual.pdf b/Doc/user-manual/user_manual.pdf
deleted file mode 100644
index 5108b94..0000000
Binary files a/Doc/user-manual/user_manual.pdf and /dev/null differ
diff --git a/Jamroot.jam b/Jamroot.jam
index d6d7823..35c6691 100644
--- a/Jamroot.jam
+++ b/Jamroot.jam
@@ -34,7 +34,6 @@ path-constant TOP : . ;     # After that, the TOP variable can be used in every
 build-project ACore ;
 build-project ANattr ;
 build-project ANode ;
-build-project AParser ;
 build-project Base ;
 build-project Client ;
 build-project CSim ;
diff --git a/Pyext/.pydevproject b/Pyext/.pydevproject
deleted file mode 100644
index a9cca03..0000000
--- a/Pyext/.pydevproject
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?eclipse-pydev version="1.0"?>
-
-<pydev_project>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
-</pydev_project>
diff --git a/Pyext/CMakeLists.txt b/Pyext/CMakeLists.txt
index 10649ee..77152ef 100644
--- a/Pyext/CMakeLists.txt
+++ b/Pyext/CMakeLists.txt
@@ -12,6 +12,10 @@
 # cct is correct as it has the "-L" but on other machines we rely on /usr/lib/libpython2.7.so.1.0 being there!
 # lxop-test does not have /usr/lib/libpython2.7.so.1.0 so ecbuild fails
 #
+# For problems with the python build, please look in <build-dir>/ecbuild.log, typically non developmental python
+# installs may not include python libs or includes
+# For ubuntoo to install we need:
+#    sudo apt-get install libpython-dev
 #
 
 file( GLOB srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp" "src/*.hpp" )
@@ -22,7 +26,6 @@ include_directories(
                      ../ACore/src 
                      ../ANattr/src
                      ../ANode/src
-                     ../AParser/src
                      ../Base/src
                      ../Base/src/cts
                      ../Base/src/stc
@@ -40,7 +43,7 @@ ecbuild_add_library( TARGET    ecflow
                      TYPE      MODULE
                      SOURCES   ${srcs}
 					 CONDITION PYTHONLIBS_FOUND
-                     LIBS      libclient libsimu base libparser node nodeattr core
+                     LIBS      libclient libsimu base node nodeattr core
                                ${PYTHON_LIBRARIES} ${OPENSSL_LIBRARIES}
                      INCLUDES 
                                ${Boost_INCLUDE_DIRS}
diff --git a/Pyext/ecflow/__init__.py b/Pyext/ecflow/__init__.py
index b4ac7df..5099c1d 100644
--- a/Pyext/ecflow/__init__.py
+++ b/Pyext/ecflow/__init__.py
@@ -1,4 +1,4 @@
-from ecflow import *
+from .ecflow import *
 
 # Name        :
 # Author      : Avi
@@ -15,6 +15,6 @@ from ecflow import *
 The ecFlow python module
 """
 
-__version__ = '4.6.1'
+__version__ = '4.7.0'
 
 # http://stackoverflow.com/questions/13040646/how-do-i-create-documentation-with-pydoc
diff --git a/Pyext/ecflow/__init__.py.in b/Pyext/ecflow/__init__.py.in
index a213157..781f72d 100644
--- a/Pyext/ecflow/__init__.py.in
+++ b/Pyext/ecflow/__init__.py.in
@@ -1,4 +1,4 @@
-from ecflow import *
+from .ecflow import *
 
 # Name        :
 # Author      : Avi
diff --git a/Pyext/jamfile.jam b/Pyext/jamfile.jam
index 1656e2e..840861f 100755
--- a/Pyext/jamfile.jam
+++ b/Pyext/jamfile.jam
@@ -71,8 +71,7 @@ project thePyext ;
 
 use-project theCore      : ../ACore ;
 use-project theNodeAttr  : ../ANattr ;
-use-project theNode      : ../ANode ;
-use-project theParser    : ../AParser ;
+use-project theNode      : ../ANode ;   
 use-project theBase      : ../Base ;
 use-project theClient    : ../Client ;
 use-project theSimulator : ../CSim ;
@@ -125,7 +124,6 @@ python-extension ecflow : [ glob src/*.cpp ]
     /theCore//core
     /theNodeAttr//nodeattr
     /theNode//node
-    /theParser//libparser
     /theBase//base
     /theClient//libclient
     /theSimulator//libsimu
diff --git a/Pyext/samples/TestBench.py b/Pyext/samples/TestBench.py
index 1427c49..e376c0e 100644
--- a/Pyext/samples/TestBench.py
+++ b/Pyext/samples/TestBench.py
@@ -117,22 +117,27 @@ if __name__ == "__main__":
             This programs assumes that ecflow module is accessible
 
             example:
-                python Pyext/samples/TestBench.py --port=3141 --verbose=True AParser/test/data/good_defs/trigger/late.def
+                python Pyext/samples/TestBench.py --port=3141 --verbose=True ANode/parser/test/data/good_defs/trigger/late.def
             """    
             
     print("####################################################################")
     print("Running ecflow version " + ecflow.Client().version()  + " debug build(" + str(ecflow.debug_build()) +")")
-    print("PYTHONPATH: " + str(os.environ['PYTHONPATH'].split(os.pathsep)))
+    if 'PYTHONPATH' in os.environ:
+        print("PYTHONPATH: " + str(os.environ['PYTHONPATH'].split(os.pathsep)))
     print("sys.path:   " + str(sys.path))
     print("####################################################################")
  
+    default_port = "3141"
+    if "ECF_PORT" in os.environ:
+         default_port = os.environ["ECF_PORT"]
+ 
     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",   
+    PARSER.add_argument('--port', default=default_port,   
                         help="The port on the host, defaults to 3141")
     PARSER.add_argument('--path', default="/",   
                         help="replace only the node path in the suite")
diff --git a/Pyext/samples/TestGui.py b/Pyext/samples/TestGui.py
index 615a980..93c6a8a 100755
--- a/Pyext/samples/TestGui.py
+++ b/Pyext/samples/TestGui.py
@@ -30,7 +30,7 @@ class Tester(object) :
         self.ci_ = ci
         self.port_ = self.ci_.get_port()
         self.ARGS_ = args
-            
+        
     def clean_up_server(self):
         self.log_msg("   clean_up server, clear log, remove check-pt, and white list file" )
         self.ci_.clear_log()    
@@ -65,14 +65,16 @@ class Tester(object) :
     def white_list_file_path(self): return "./" + gethostname() + "." + self.port_ + ".ecf.lists"
 
     def path_to_ecflow_client(self):
-        # to use the build, in preference, to release build
-        path_to_client = File.find_client()
+        if self.ARGS_.ecflow_client != "":
+            return self.ARGS_.ecflow_client
+        # to use the local build, in preference, to release version of ecflow
+        path_to_client = File.find_client() # version used by the ecflow module, may not exist anymore
         if os.path.exists(path_to_client):
             return path_to_client
         path_to_client = "/usr/local/apps/ecflow/" + self.ci_.version() + "/bin/ecflow_client"
         if os.path.exists(path_to_client):
             return path_to_client
-        return "ecflow_client" # fall back, just search on $PATH in the scripts
+        return "ecflow_client" # fall back, just search on $PATH *IN* the shell where the server was started
      
     def create_defs(self,name=""):
         defs = Defs()
@@ -1480,11 +1482,13 @@ if __name__ == "__main__":
               To debug this tests, just set sync_sleep = 0, this will also preserve the test data.
                  - Test data is created in directory: test_gui, this will deleted at the end of the test.
                  - Assumes includes head.h and tail.h are in CWD + /Pyext/test/data/includes
-                 - We will look for the ecflow_client in the embedded child commands in the generetd scripts, 
-                   first in the current cmake build tree, otherwise /usr/local/apps/ecflow, with same 
-                   version as this ecflow python api.
+                 - We will look for the ecflow_client in the embedded child commands in the generated scripts, 
+                   o first look in the current cmake build tree of the ecflow module(this may no longer exist)
+                   o Next will use /usr/local/apps/ecflow/ with same version as this ecflow python api *IF* it exists
+                   o Finally use 'ecflow_client' hence will expect to find it on $PATH, *ON* the server environment
+                   To override this use --ecflow_client=/path/to/your/ecflow_client
               Usage:
-                   TestGui.py --host <hostname> --port <portname> --time <sec> --sync_sleep <sec> 
+                   TestGui.py --host <hostname> --port <portname> --time <sec> --sync_sleep <sec> --ecflow_client <path>
             """    
     PARSER = argparse.ArgumentParser(description=DESC,  
                                      formatter_class=argparse.RawDescriptionHelpFormatter)
@@ -1496,8 +1500,14 @@ if __name__ == "__main__":
                         help="How long to run the tests in seconds. default is 0, which is one test loop")
     PARSER.add_argument('--sync_sleep', type=int,default=4,   
                         help="Time to wait after sync_local. Allow GUI to refresh. Set to 0 for debug.")
+    PARSER.add_argument('--ecflow_client',default="",   
+                        help="Path to ecflow_client.")
     ARGS = PARSER.parse_args()
     print ARGS   
+    if ARGS.ecflow_client != "":
+        if not os.path.exists(ARGS.ecflow_client):
+            print("Could not find ecflow_client on path ",ARGS.ecflow_client)
+            exit(1)
      
     # ===========================================================================
     CL = ecflow.Client(ARGS.host, ARGS.port)
@@ -1510,7 +1520,6 @@ if __name__ == "__main__":
         count = 1
         start_time = time.time()
         while True:
-            tester = Tester(CL,ARGS)
             tester.test_gui()
             elapsed = int(time.time() - start_time)
             print "======================================================"
diff --git a/Pyext/samples/TestJobGenPerf.py b/Pyext/samples/TestJobGenPerf.py
index db64547..92fd2bb 100644
--- a/Pyext/samples/TestJobGenPerf.py
+++ b/Pyext/samples/TestJobGenPerf.py
@@ -18,7 +18,7 @@
 #   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
+#   It is tied to ANode/parser/test/TestJobGenPerf.cpp
 # =============================================================================
 import ecflow
 import os       # for getenv
diff --git a/Pyext/setup.py b/Pyext/setup.py
index 782e2ec..c89b549 100755
--- a/Pyext/setup.py
+++ b/Pyext/setup.py
@@ -64,7 +64,6 @@ boost_root=os.getenv("BOOST_ROOT")
 include_dirs = [ "/tmp/ma0/workspace/ecflow/Pyext/../ACore/src", 
                  "/tmp/ma0/workspace/ecflow/Pyext/../ANattr/src", 
                  "/tmp/ma0/workspace/ecflow/Pyext/../ANode/src",
-                 "/tmp/ma0/workspace/ecflow/Pyext/../AParser/src",
                  "/tmp/ma0/workspace/ecflow/Pyext/../Base/src",
                  "/tmp/ma0/workspace/ecflow/Pyext/../Base/src/cts",
                  "/tmp/ma0/workspace/ecflow/Pyext/../Base/src/stc",
@@ -80,7 +79,6 @@ boost_lib_dir = boost_root + "/stage/lib/"
 library_dirs = ['/tmp/ma0/workspace/ecflow/build/ACore',
                 '/tmp/ma0/workspace/ecflow/build/ANattr/',
                 '/tmp/ma0/workspace/ecflow/build/ANode/',
-                '/tmp/ma0/workspace/ecflow/build/AParser/', 
                 '/tmp/ma0/workspace/ecflow/build/Base/', 
                 '/tmp/ma0/workspace/ecflow/build/CSim/', 
                 '/tmp/ma0/workspace/ecflow/build/Client/', 
@@ -88,7 +86,7 @@ library_dirs = ['/tmp/ma0/workspace/ecflow/build/ACore',
                ]
 
 # define the libraries to link with this includes the boost lib
-libraries = [ 'core' , 'nodeattr', 'node', 'libparser', 'base', 'libsimu', 'libclient',
+libraries = [ 'core' , 'nodeattr', 'node', 'base', 'libsimu', 'libclient',
               'boost_system-mt',
               'boost_serialization-mt',
               'boost_filesystem-mt',
diff --git a/Pyext/setup.py.in b/Pyext/setup.py.in
index 0cb1e85..bffa81c 100755
--- a/Pyext/setup.py.in
+++ b/Pyext/setup.py.in
@@ -64,7 +64,6 @@ 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",
@@ -80,7 +79,6 @@ 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/', 
@@ -88,7 +86,7 @@ library_dirs = ['@CMAKE_BINARY_DIR@/ACore',
                ]
 
 # define the libraries to link with this includes the boost lib
-libraries = [ 'core' , 'nodeattr', 'node', 'libparser', 'base', 'libsimu', 'libclient',
+libraries = [ 'core' , 'nodeattr', 'node', 'base', 'libsimu', 'libclient',
               'boost_system-mt',
               'boost_serialization-mt',
               'boost_filesystem-mt',
diff --git a/Pyext/src/ClientDoc.cpp b/Pyext/src/ClientDoc.cpp
index 461afa2..243e963 100644
--- a/Pyext/src/ClientDoc.cpp
+++ b/Pyext/src/ClientDoc.cpp
@@ -284,10 +284,11 @@ const char* ClientDoc::wait_for_server_reply() {
 
 const char* ClientDoc::load_defs(){
    return
-            "Load a :term:`suite definition` given by the file_path argument into the :term:`ecflow_server`::\n\n"
+            "Load a :term:`suite definition` or checkpoint file 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"
+            "      [(bool)print=False]  : print parsed defs to standard out\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"
@@ -303,7 +304,7 @@ const char* ClientDoc::load_defs(){
             "   ...\n"
             "   try:\n"
             "       ci = Client()       # use default host(ECF_HOST) & port(ECF_PORT)\n"
-            "       ci.load(defs_file)  # open and parse defs file, and load into server.\n"
+            "       ci.load(defs_file)  # open and parse defs or checkpoint file, and load into server.\n"
             "   except RuntimeError, e:\n"
             "       print str(e)\n"
             ;
@@ -1417,3 +1418,43 @@ const char* ClientDoc::check()
             "       print str(e)\n"
             ;
 }
+
+const char* ClientDoc::set_child_path()
+{
+   return   "Set the path to the task, obtained from server using %ECF_NAME%\n"
+            "By default the environment variable ECF_NAME is read for the task path\n"
+            "This can be overridden for the python child api"
+            ;
+}
+const char* ClientDoc::set_child_password()
+{
+   return   "Set the password, needed for authentication, provided by the server using %ECF_PASS%\n"
+            "By default the environment variable ECF_PASS is read for the jobs password\n"
+            "This can be overridden for the python child api"
+            ;
+}
+
+const char* ClientDoc::set_child_pid()
+{
+   return   "Set the process id of this job\n"
+            "By default the environment variable ECF_RID is read for the jobs process or remote id\n"
+            "This can be overridden for the python child api"
+            ;
+}
+
+const char* ClientDoc::set_child_try_no()
+{
+   return   "Set the try no, i.e the number of times this job has run, obtained from the server, using %ECF_TRYNO%\n"
+            "By default the environment variable ECF_TRYNO is read to record number of times job has been run\n"
+            "This can be overridden for the python child api"
+            ;
+
+}
+
+const char* ClientDoc::set_child_timeout()
+{
+   return   "Set timeout if child can not connect to server, default is 24 hours. The input is required to be in seconds\n"
+            "By default the environment variable  ECF_TIMEOUT is read to control how long child command should attempt to connect to the server\n"
+            "This can be overridden for the python child api"
+            ;
+}
diff --git a/Pyext/src/ClientDoc.hpp b/Pyext/src/ClientDoc.hpp
index f9618db..ad9a3f5 100644
--- a/Pyext/src/ClientDoc.hpp
+++ b/Pyext/src/ClientDoc.hpp
@@ -84,7 +84,12 @@ public:
    static const char* resume();
    static const char* job_gen();
 	static const char* delete_node();
-	static const char* delete_all();
+   static const char* delete_all();
+   static const char* set_child_path();
+   static const char* set_child_password();
+   static const char* set_child_pid();
+   static const char* set_child_try_no();
+   static const char* set_child_timeout();
 
 private:
 	ClientDoc(){}
diff --git a/Pyext/src/ExportClient.cpp b/Pyext/src/ExportClient.cpp
index e28e5f3..8a87fb1 100644
--- a/Pyext/src/ExportClient.cpp
+++ b/Pyext/src/ExportClient.cpp
@@ -188,7 +188,7 @@ void export_Client()
 	.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::loadDefs,(bp::arg("path_to_defs"),bp::arg("force")=false,bp::arg("check_only")=false,bp::arg("print")=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())
@@ -270,12 +270,12 @@ void export_Client()
    .def("zombie_remove",    &ClientInvoker::zombieRemoveCli )
    .def("zombie_kill",      &ClientInvoker::zombieKillCli )
 
-   .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("set_child_path",      &ClientInvoker::set_child_path ,    ClientDoc::set_child_path())
+   .def("set_child_password",  &ClientInvoker::set_child_password, ClientDoc::set_child_password())
+   .def("set_child_pid",       &ClientInvoker::set_child_pid,      ClientDoc::set_child_pid())
+   .def("set_child_pid",       &set_child_pid,                     ClientDoc::set_child_pid())
+   .def("set_child_try_no",    &ClientInvoker::set_child_try_no,   ClientDoc::set_child_try_no())
+   .def("set_child_timeout",   &ClientInvoker::set_child_timeout,  ClientDoc::set_child_timeout())
    .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")
diff --git a/Pyext/src/ExportCore.cpp b/Pyext/src/ExportCore.cpp
index bdecdf3..4c88c8d 100644
--- a/Pyext/src/ExportCore.cpp
+++ b/Pyext/src/ExportCore.cpp
@@ -59,8 +59,10 @@ void export_Core()
    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")
+            .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")
+            .def("source_dir", &File::root_source_dir, "Path name to ecflow source directory") .staticmethod("source_dir")
+            .def("build_dir",  &File::root_build_dir, "Path name to ecflow build directory")   .staticmethod("build_dir")
  	;
 
 	enum_<PrintStyle::Type_t>("Style",
diff --git a/Pyext/src/ExportDefs.cpp b/Pyext/src/ExportDefs.cpp
index cbe0af6..8ac3b99 100644
--- a/Pyext/src/ExportDefs.cpp
+++ b/Pyext/src/ExportDefs.cpp
@@ -24,7 +24,6 @@
 #include "Suite.hpp"
 #include "PrintStyle.hpp"
 #include "File.hpp"
-#include "DefsStructureParser.hpp"
 #include "JobCreationCtrl.hpp"
 #include "Simulator.hpp"
 #include "BoostPythonUtil.hpp"
@@ -60,9 +59,8 @@ 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)) {
+   if (!defs->restore(file_name,errorMsg,warningMsg)) {
       throw std::runtime_error(errorMsg);
    }
    if (!warningMsg.empty()) std::cerr << warningMsg;
@@ -83,12 +81,19 @@ std::string check_defs(defs_ptr defs)
 
 void save_as_checkpt(defs_ptr defs, const std::string& file_name)
 {
-   defs->save_as_checkpt(file_name); // use default ARCHIVE
+   defs->boost_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
+   // Temp, until default ecflow version is 4.7.0, ECFLOW-939
+   try {
+      defs->restore(file_name);
+      return;
+   }
+   catch(...){}
+
+   defs->boost_restore_from_checkpt(file_name); // use default ARCHIVE
 }
 
 std::string simulate(defs_ptr defs)
diff --git a/Pyext/src/ExportNode.cpp b/Pyext/src/ExportNode.cpp
index c14e784..2fed0c6 100644
--- a/Pyext/src/ExportNode.cpp
+++ b/Pyext/src/ExportNode.cpp
@@ -351,4 +351,7 @@ void export_Node()
    .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" )
    ;
+#if defined(__clang__)
+   boost::python::register_ptr_to_python<node_ptr>(); // needed for mac and boost 1.6
+#endif
 }
diff --git a/Pyext/src/ExportNodeAttr.cpp b/Pyext/src/ExportNodeAttr.cpp
index a2ac07d..dbc66d9 100644
--- a/Pyext/src/ExportNodeAttr.cpp
+++ b/Pyext/src/ExportNodeAttr.cpp
@@ -204,6 +204,9 @@ void export_NodeAttr()
    .def("decrement",&Limit::decrement, "used for test only")
    .def("node_paths",&wrap_set_of_strings,"List of nodes(paths) that have consumed a limit")
  	;
+#if defined(__clang__)
+   boost::python::register_ptr_to_python< boost::shared_ptr<Limit> >(); // needed for mac and boost 1.6
+#endif
 
 	class_<InLimit>("InLimit",NodeAttrDoc::inlimit_doc(),init<std::string,  std::string, optional<int> >())
 	.def( init<std::string,std::string> () )
@@ -320,7 +323,9 @@ void export_NodeAttr()
    .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")
  	;
-
+#if defined(__clang__)
+   boost::python::register_ptr_to_python< boost::shared_ptr<LateAttr> >(); // needed for mac and boost 1.6
+#endif
 
 	class_<AutoCancelAttr, boost::shared_ptr<AutoCancelAttr> >(
 			"Autocancel",NodeAttrDoc::autocancel_doc() ,
@@ -335,7 +340,9 @@ void export_NodeAttr()
 	.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")
   	;
-
+#if defined(__clang__)
+   boost::python::register_ptr_to_python< boost::shared_ptr<AutoCancelAttr> >(); // needed for mac and boost 1.6
+#endif
 
 	class_<RepeatDate >("RepeatDate",NodeAttrDoc::repeat_date_doc() ,init< std::string, int, int, optional<int> >()) // name, start, end , delta
  	.def(self == self )                              // __eq__
@@ -363,12 +370,15 @@ void export_NodeAttr()
    .def("__init__",make_constructor(&create_RepeatEnumerated) )
 	.def(self == self )                                     // __eq__
 	.def("__str__",        &RepeatEnumerated::toString)     // __str__
-   .def("__copy__",       copyObject<RepeatEnumerated>)    // __copy__ uses copy constructor
+    .def("__copy__",       copyObject<RepeatEnumerated>)    // __copy__ uses copy constructor
 	.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)
 	;
+#if defined(__clang__)
+   boost::python::register_ptr_to_python< boost::shared_ptr<RepeatEnumerated> >(); // needed for mac and boost 1.6
+#endif
 
 	class_<RepeatString,boost::shared_ptr<RepeatString> >("RepeatString", NodeAttrDoc::repeat_string_doc())
    .def("__init__",make_constructor(&create_RepeatString) )
@@ -380,6 +390,9 @@ void export_NodeAttr()
 	.def("end",            &RepeatString::end)
 	.def("step",           &RepeatString::step)
 	;
+#if defined(__clang__)
+   boost::python::register_ptr_to_python< boost::shared_ptr<RepeatString> >(); // needed for mac and boost 1.6
+#endif
 
 	class_<RepeatDay>("RepeatDay",NodeAttrDoc::repeat_day_doc(),init< optional<int> >())
  	.def(self == self )                              // __eq__
@@ -390,13 +403,13 @@ void export_NodeAttr()
 	class_<Repeat>("Repeat",NodeAttrDoc::repeat_doc() ,init< int >())
 	.def(self == self )                    // __eq__
 	.def("__str__", &Repeat::toString)     // __str__
-   .def("__copy__",copyObject<Repeat>)    // __copy__ uses copy constructor
+    .def("__copy__",copyObject<Repeat>)    // __copy__ uses copy constructor
 	.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")
+    .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")
 	;
 
 
@@ -405,14 +418,14 @@ void export_NodeAttr()
 	class_<CronAttr>("Cron",NodeAttrDoc::cron_doc() )
 	.def(self == self )                                // __eq__
 	.def("__str__",            &CronAttr::toString)    // __str__
-   .def("__copy__",copyObject<CronAttr>)              // __copy__ uses copy constructor
-   .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("__copy__",copyObject<CronAttr>)              // __copy__ uses copy constructor
+    .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( "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")
@@ -429,11 +442,11 @@ void export_NodeAttr()
 
 	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( init<int,int,int,bool>())
+    .def( init<bool>())
 	.def(self == self )                                   // __eq__
 	.def("__str__",             &ClockAttr::toString)     // __str__
-   .def("__copy__",copyObject<ClockAttr>)                // __copy__ uses copy constructor
+    .def("__copy__",copyObject<ClockAttr>)                // __copy__ uses copy constructor
 	.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")
@@ -444,4 +457,7 @@ void export_NodeAttr()
 	.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")
 	;
+#if defined(__clang__)
+   boost::python::register_ptr_to_python< boost::shared_ptr<ClockAttr> >(); // needed for mac and boost 1.6
+#endif
 }
diff --git a/Pyext/src/ExportSuiteAndFamily.cpp b/Pyext/src/ExportSuiteAndFamily.cpp
index b3b940f..823182a 100644
--- a/Pyext/src/ExportSuiteAndFamily.cpp
+++ b/Pyext/src/ExportSuiteAndFamily.cpp
@@ -80,7 +80,9 @@ void export_SuiteAndFamily()
    .def("__enter__", &family_enter)       // allow with statement, hence indentation support
    .def("__exit__",  &family_exit)        // allow with statement, hence indentation support
    ;
-
+#if defined(__clang__)
+   boost::python::register_ptr_to_python<family_ptr>(); // needed for mac and boost 1.6
+#endif
 
    class_<Suite, bases<NodeContainer>, suite_ptr>("Suite",DefsDoc::suite_doc())
    .def("__init__",make_constructor(&Suite::create), DefsDoc::suite_doc())
@@ -95,4 +97,7 @@ void export_SuiteAndFamily()
    .def("get_end_clock", &Suite::clock_end_attr,"Return the suite's end clock. Can be NULL")
    .def("begun",     &Suite::begun, "Returns true if the :term:`suite` has begun, false otherwise")
    ;
+#if defined(__clang__)
+   boost::python::register_ptr_to_python<suite_ptr>(); // needed for mac and boost 1.6
+#endif
 }
diff --git a/Pyext/src/ExportTask.cpp b/Pyext/src/ExportTask.cpp
index 0f1510d..086b26f 100644
--- a/Pyext/src/ExportTask.cpp
+++ b/Pyext/src/ExportTask.cpp
@@ -60,10 +60,16 @@ void export_Task()
    .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")
    ;
+#if defined(__clang__)
+   boost::python::register_ptr_to_python<task_ptr>(); // needed for mac and boost 1.6
+#endif
 
    class_<Alias, bases<Submittable>, alias_ptr>("Alias",DefsDoc::alias_doc(),no_init)
    .def(self == self )                  // __eq__
    .def("__str__", &Alias::to_string)   // __str__
    .def("__copy__", copyObject<Alias>)  // __copy__ uses copy constructor
    ;
+#if defined(__clang__)
+   boost::python::register_ptr_to_python<alias_ptr>(); // needed for mac and boost 1.6
+#endif
 }
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/includes/head.h b/Pyext/test/data/CUSTOMER/ECF_HOME/includes/head.h
deleted file mode 100644
index 04aa932..0000000
--- a/Pyext/test/data/CUSTOMER/ECF_HOME/includes/head.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/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 variables that are needed for any communication with ECF
-export ECF_PORT=%ECF_PORT%    # The server port number
-export ECF_HOST=%ECF_HOST%    # The name of ecf 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
-export ECF_RID=$$
-
-# Tell ecFlow we have started
-%ECF_CLIENT_EXE_PATH:ecflow_client% --init=$$
-
-# Defined a error handler
-ERROR() {
-   set +e                      # Clear -e flag, so we don't fail
-   %ECF_CLIENT_EXE_PATH:ecflow_client% --abort=trap   # Notify ecFlow that something went wrong, using 'trap' as the reason
-   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/Pyext/test/data/CUSTOMER/ECF_HOME/includes/tail.h b/Pyext/test/data/CUSTOMER/ECF_HOME/includes/tail.h
deleted file mode 100644
index ca0f8da..0000000
--- a/Pyext/test/data/CUSTOMER/ECF_HOME/includes/tail.h
+++ /dev/null
@@ -1,3 +0,0 @@
-%ECF_CLIENT_EXE_PATH:ecflow_client% --complete    # Notify ecFlow of a normal end
-trap 0                 # Remove all traps
-exit 0                 # End the shell
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t1.ecf b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t1.ecf
deleted file mode 100644
index 93b95c8..0000000
--- a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t1.ecf
+++ /dev/null
@@ -1,25 +0,0 @@
-%include <head.h>
-%manual
-This is the default **generated** ecf script file
-If the task has events, meters or labels then the associated client
-to server commands are automatically generated.
-Will default to sleep for one second in between calls to the events, meters & labels,
-this can be overridden by adding a variable SLEEP
-%end
-
-%comment
-#============================================================
-# Using angle brackets means we look in directory ECF_INCLUDE
-# and then ECF_HOME
-#============================================================
-%end
-
-echo do some work
-
-
-
-sleep %SLEEP%
-
-echo end of job
-
-%include <tail.h>
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t2.ecf b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t2.ecf
deleted file mode 100644
index 93b95c8..0000000
--- a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/anon/t2.ecf
+++ /dev/null
@@ -1,25 +0,0 @@
-%include <head.h>
-%manual
-This is the default **generated** ecf script file
-If the task has events, meters or labels then the associated client
-to server commands are automatically generated.
-Will default to sleep for one second in between calls to the events, meters & labels,
-this can be overridden by adding a variable SLEEP
-%end
-
-%comment
-#============================================================
-# Using angle brackets means we look in directory ECF_INCLUDE
-# and then ECF_HOME
-#============================================================
-%end
-
-echo do some work
-
-
-
-sleep %SLEEP%
-
-echo end of job
-
-%include <tail.h>
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t.ecf b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t.ecf
deleted file mode 100644
index 93b95c8..0000000
--- a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t.ecf
+++ /dev/null
@@ -1,25 +0,0 @@
-%include <head.h>
-%manual
-This is the default **generated** ecf script file
-If the task has events, meters or labels then the associated client
-to server commands are automatically generated.
-Will default to sleep for one second in between calls to the events, meters & labels,
-this can be overridden by adding a variable SLEEP
-%end
-
-%comment
-#============================================================
-# Using angle brackets means we look in directory ECF_INCLUDE
-# and then ECF_HOME
-#============================================================
-%end
-
-echo do some work
-
-
-
-sleep %SLEEP%
-
-echo end of job
-
-%include <tail.h>
diff --git a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t1.ecf b/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t1.ecf
deleted file mode 100644
index b8d8a0f..0000000
--- a/Pyext/test/data/CUSTOMER/ECF_HOME/obs/f1/t1.ecf
+++ /dev/null
@@ -1,26 +0,0 @@
-%include <head.h>
-%manual
-This is the default **generated** ecf script file
-If the task has events, meters or labels then the associated client
-to server commands are automatically generated.
-Will default to sleep for one second in between calls to the events, meters & labels,
-this can be overridden by adding a variable SLEEP
-%end
-
-%comment
-#============================================================
-# Using angle brackets means we look in directory ECF_INCLUDE
-# and then ECF_HOME
-#============================================================
-%end
-
-echo do some work
-%ECF_CLIENT_EXE_PATH:ecflow_client% --event=event
-sleep %SLEEP%
-
-
-
-
-echo end of job
-
-%include <tail.h>
diff --git a/Pyext/test/data/includes/head.h b/Pyext/test/data/includes/head.h
index e517d43..93a1c27 100755
--- a/Pyext/test/data/includes/head.h
+++ b/Pyext/test/data/includes/head.h
@@ -11,22 +11,19 @@ set -x # echo script lines as they are executed
 ## 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_
+# Defines the variables that are needed for any communication with ecflow server
 
 export ECF_PORT=%ECF_PORT%    # ECF port number on the server
 export ECF_HOST=%ECF_HOST%    # The hostname where the server is running
 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
+export ECF_RID=$$             # Let All child commands pass process id to server
 
-# 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% --version
 %ECF_CLIENT_EXE_PATH:ecflow_client% --init=$$
 
-# Defined a error hanlder
+# Define a error hanlder
 
 ERROR() {
 	set +e                                       # Clear -e flag, so we don't fail
diff --git a/Pyext/test/ecflow_test_util.py b/Pyext/test/ecflow_test_util.py
index 947c839..0f81a46 100644
--- a/Pyext/test/ecflow_test_util.py
+++ b/Pyext/test/ecflow_test_util.py
@@ -14,8 +14,9 @@
 #
 #////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
 from socket import gethostname 
-import os,fnmatch
+import os,sys,fnmatch
 import fcntl
+import datetime,time
 import shutil   # used to remove directory tree
 
 from ecflow import Client, debug_build, File
@@ -48,42 +49,6 @@ def ecf_home(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 "   head:" + head
-        #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
-        
-        if tail != "Pyext" and tail != "migrate":
-            # 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/workspace/ecflow/Acore
-                    if line.find("Source directory"):
-                        tokens = line.split()
-                        if len(tokens) == 4:
-                            #print "   returning root_source_dir:", tokens[3]
-                            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"
@@ -119,14 +84,15 @@ class EcfPortLock(object):
     
     def find_free_port(self,seed_port):
         print("   EcfPortLock:find_free_port starting with " + str(seed_port))
+        at_time = datetime.datetime.fromtimestamp(time.time()).strftime('%H:%M:%S')
         port = seed_port
         while 1:
             if self._free_port(port) == True:
-                print("   *FOUND* free server port " + str(port))
+                print("   *FOUND* free server port " + str(port) + " : " + at_time)
                 if self._do_lock(port) == True:
                     break;
             else:
-                 print("   *Server* port " + str(port) + " busy, trying next port")
+                print("   *Server* port " + str(port) + " busy, trying next port " + at_time)
             port = port + 1
             
         return str(port)  
@@ -142,26 +108,43 @@ class EcfPortLock(object):
             
     def _do_lock(self,port):
         file = self._lock_file(port)
+        at_time = datetime.datetime.fromtimestamp(time.time()).strftime('%H:%M:%S')
+        if os.path.exists(file):
+            print("   *LOCKED* lock file exists " + file + " : " + at_time )
+            return False
         try:
             fp = open(file, 'w') 
             try:
+                self.lock_time = at_time
                 fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
                 self.lock_file_fp = fp
-                print("   *LOCKED* file " + file)
+                print("   *LOCKED* file " + file + " : " + self.lock_time )
                 return True;
             except IOError:
-                print("   Could *NOT* lock file " + file + " trying next port")
+                print("   Could *NOT* lock file " + file + " trying next port : " + at_time)
                 return False
         except IOError as e:
-             print("   Could not open file " + file + " for write trying next port")
+             print("   Could not open file " + file + " for write trying next port : " + at_time)
              return False
         
     def remove(self,port):
+        release_time = datetime.datetime.fromtimestamp(time.time()).strftime('%H:%M:%S')
+        file = self._lock_file(port)
+        print("   Remove lock file : " + file + " : lock_time: " + self.lock_time + " release_time: " + release_time)
         self.lock_file_fp.close()
-        os.remove(self._lock_file(port))
+        os.remove(file)
     
     def _lock_file(self,port):
-        lock_file = str(port) + ".lock"
+        if "ECF_PORT_LOCK_DIR" in os.environ:
+            lock_file = os.environ["ECF_PORT_LOCK_DIR"] + "/" + str(port) + ".lock"
+            #print("     EcfPortLock::_lock_file ECF_PORT_LOCK_DIR: " + lock_file)
+            return lock_file
+        if os.path.exists(File.source_dir()):
+            lock_file = File.source_dir() + "/" + str(port) + ".lock"
+            #print("     EcfPortLock::_lock_file File::source_dir(): " + lock_file)
+            return lock_file
+        lock_file = os.getcwd() + "/" + str(port) + ".lock"
+        #print("     EcfPortLock::_lock_file os.getcwd(): " + lock_file)
         return lock_file
         
 # ===============================================================================
@@ -187,11 +170,13 @@ class Server(object):
      
     def __enter__(self):
         try:
-            print("Server:__enter__: About to ping localhost:" + self.the_port)       
+            st = datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
+            print("Server:__enter__: About to ping localhost: " + self.the_port +  " : " + st)       
             self.ci.ping() 
-            print("   ------- Server all ready running *UNEXPECTED* ------")
+            print("   ------- Server all ready running on port " + self.the_port + " *UNEXPECTED* ------")
+            sys.exit(1)
         except RuntimeError as e:
-            print("   ------- Server not running as *EXPECTED* ------ ") 
+            print("   ------- Server *NOT* running on port " + self.the_port + " 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))
@@ -226,7 +211,6 @@ class Server(object):
         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))
         
diff --git a/Pyext/test/py_s_TestClientApi.py b/Pyext/test/py_s_TestClientApi.py
index 0ca36a9..9a392d2 100644
--- a/Pyext/test/py_s_TestClientApi.py
+++ b/Pyext/test/py_s_TestClientApi.py
@@ -122,7 +122,7 @@ def test_client_new_log(ci, port):
     
     ci.new_log(new_log_file_name) 
     ci.flush_log() # close log file and force write to disk
-    assert os.path.exists(new_log_file_name), "New log does not exist"
+    assert os.path.exists(new_log_file_name),new_log_file_name + " : New log does not exist"
     
     # reset new log to original
     ci.new_log(Test.log_file_path(port)) 
@@ -744,7 +744,12 @@ def test_client_get_file(ci):
     print("test_client_get_file")
     ci.delete_all()     
     defs = create_defs("test_client_get_file")  
-      
+    
+    # Also test where user has specified his OWN ECF_JOBOUT (rare)
+    t2 = defs.find_abs_node("/test_client_get_file/f1/t2")
+    t2_jobout = Test.ecf_home(the_port) + "/test_client_get_file/t2.xx"
+    t2.add_variable("ECF_JOBOUT",t2_jobout)
+    
     defs.generate_scripts();
     msg = defs.check_job_creation()
     assert len(msg) == 0, msg
@@ -765,6 +770,13 @@ def test_client_get_file(ci):
         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"
+
+        for file_t in [ 'script', 'job', 'jobout', 'manual' ]:
+            the_returned_file = ci.get_file('/test_client_get_file/f1/t2',file_t)  # make a request to the server
+            assert len(the_returned_file) > 0,"Expected ci.get_file(/test_client_get_file/f1/t2," + file_t + ") to return something"
+
+        assert os.path.exists(t2_jobout),"User specified ECF_JOBOUT file not created " + t2_jobout
+ 
     except RuntimeError as e:
         print(str(e))
 
@@ -895,8 +907,12 @@ def test_client_alter_add(ci):
 def test_client_alter_delete(ci):
     print("test_client_alter_delete")
     ci.delete_all() 
-    defs =create_defs("test_client_alter_delete")  
-     
+    defs = create_defs("test_client_alter_delete")  
+    suite_with_limits = defs.add_suite("suite_with_limits")
+    suite_with_limits.add_limit("limitX",10)
+    suite_with_limits_X = defs.add_suite("suite_with_limits_X")
+    suite_with_limits_X.add_limit("limitX",10)
+ 
     t1 = "/test_client_alter_delete/f1/t1"
     task_t1 = defs.find_abs_node(t1)
     task_t1.add_variable("var","value")
@@ -924,6 +940,8 @@ def test_client_alter_delete(ci):
     task_t1.add_limit("limit1",10)
     task_t1.add_inlimit( "limit",t1,2)
     task_t1.add_inlimit( "limit1",t1,2)
+    task_t1.add_inlimit( "limitX","/suite_with_limits",2)
+    task_t1.add_inlimit( "limitX","/suite_with_limits_X",2)
     task_t1.add_trigger( "t2 == active" )
     task_t1.add_complete( "t2 == complete" )
     
@@ -940,6 +958,7 @@ def test_client_alter_delete(ci):
     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
     
+    print(defs)
     ci.load(defs)   
 
     ci.alter(t1,"delete","variable","var")
@@ -1014,24 +1033,36 @@ def test_client_alter_delete(ci):
     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.alter(t1,"delete","inlimit","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")   
+    assert( len(list(task_t1.inlimits))) == 3 ,"Expected 3 inlimit :\n" + str(ci.get_defs())
+    
+    ci.alter(t1,"delete","inlimit","/suite_with_limits:limitX")   
     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())
+    assert( len(list(task_t1.inlimits))) == 2 ,"Expected 2 inlimit :\n" + str(ci.get_defs())
 
-    ci.alter(t1,"delete","inlimit","limit")
+    ci.alter(t1,"delete","inlimit","/suite_with_limits_X:limitX")   
     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","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","cron")   
     ci.sync_local()
     task_t1 = ci.get_defs().find_abs_node(t1)
diff --git a/Pyext/test/py_s_TestPythonChildApi.py b/Pyext/test/py_s_TestPythonChildApi.py
index a6e4a61..2b08f01 100644
--- a/Pyext/test/py_s_TestPythonChildApi.py
+++ b/Pyext/test/py_s_TestPythonChildApi.py
@@ -18,11 +18,11 @@ import sys  # determine python version
 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
+from ecflow import Defs, Clock, DState,  Style, State, PrintStyle, File, Client, SState, File, debug_build
 import ecflow_test_util as Test
 
 
-def ecf_includes() : return Test.get_root_source_dir() + "/Pyext" + "/test/data/python_includes"
+def ecf_includes() : return File.source_dir() + "/Pyext" + "/test/data/python_includes"
 
 def create_defs(name,the_port):
     defs = Defs()
diff --git a/Pyext/test/py_u_TestAddDelete.py b/Pyext/test/py_u_TestAddDelete.py
index 7b984ea..6a99c1b 100644
--- a/Pyext/test/py_u_TestAddDelete.py
+++ b/Pyext/test/py_u_TestAddDelete.py
@@ -175,8 +175,14 @@ if __name__ == "__main__":
     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.add_inlimit("limitNameA", "/s1/f1", 2)
+    suite.add_inlimit("limitNameA", "/s1/f1/a", 2)
+    suite.add_inlimit("limitNameA", "/s1/f1/b", 2)
+    assert len(list(suite.inlimits)) == 7, "Expected 7 inLimits"
+    suite.delete_inlimit("limitName1"); assert len(list(suite.inlimits)) == 6, "Expected 6 inlimits since we just deleted one limitName1" 
+    suite.delete_inlimit("/s1/f1:limitNameA"); assert len(list(suite.inlimits)) == 5, "Expected 5 inlimits since we just deleted one limitName1" 
+    suite.delete_inlimit("/s1/f1/a:limitNameA"); assert len(list(suite.inlimits)) == 4, "Expected 4 inlimits since we just deleted one limitName1" 
+    suite.delete_inlimit("/s1/f1/b:limitNameA"); 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"
 
     #===============================================================================
diff --git a/Pyext/test/py_u_TestAutoAddExtern.py b/Pyext/test/py_u_TestAutoAddExtern.py
index 3158e44..1af63aa 100644
--- a/Pyext/test/py_u_TestAutoAddExtern.py
+++ b/Pyext/test/py_u_TestAutoAddExtern.py
@@ -45,5 +45,5 @@ if __name__ == "__main__":
     f2.add_task("t").add_inlimit("sg1","/suiteName");          check_then_auto_add_extern(defs)
     f2.add_task("t1").add_inlimit("hpcd","/obs/limits");       check_then_auto_add_extern(defs) 
     f2.add_task("t2").add_inlimit("c1a","/limits");            check_then_auto_add_extern(defs)     
-    print defs
+    print (defs)
     print("All Tests pass")
diff --git a/Pyext/test/py_u_TestGeneratedVariable.py b/Pyext/test/py_u_TestGeneratedVariable.py
index c2c7c0a..24fc4f0 100644
--- a/Pyext/test/py_u_TestGeneratedVariable.py
+++ b/Pyext/test/py_u_TestGeneratedVariable.py
@@ -33,7 +33,7 @@ if __name__ == "__main__":
     suite.get_generated_variables(variable_list)
     for gen_var in variable_list:
         print(gen_var)
-    assert len(list(variable_list)) == 13,"Expected 13 generated variables for suites"    
+    assert len(list(variable_list)) == 14,"Expected 14 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()
 
@@ -70,7 +70,7 @@ if __name__ == "__main__":
     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()
+    assert variable_list[7].value() == "", "expected generated variable of value '' but found " + variable_list[7].value()
 
     print("\nAll Tests pass")
     
diff --git a/Pyext/test/py_u_TestJobGeneration.py b/Pyext/test/py_u_TestJobGeneration.py
index 9e33ef8..4d5c1b0 100644
--- a/Pyext/test/py_u_TestJobGeneration.py
+++ b/Pyext/test/py_u_TestJobGeneration.py
@@ -19,7 +19,7 @@ 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 ecf_includes() : return File.source_dir() + "/Pyext" + "/test/data/includes"
 
 def create_defs(ecf_home,task_vec):
     defs = Defs();
@@ -80,7 +80,7 @@ if __name__ == "__main__":
     print("Running ecflow version " + Client().version() + " debug build(" + str(debug_build()) +")")
     print("####################################################################")
  
-    workspace = Test.get_root_source_dir();
+    workspace = File.source_dir();
     print(workspace)
     
     ecf_home = workspace + "/Pyext/test/data/ECF_HOME"
diff --git a/Pyext/test/py_u_TestSimulator.py b/Pyext/test/py_u_TestSimulator.py
index b0b49a0..7b176c7 100644
--- a/Pyext/test/py_u_TestSimulator.py
+++ b/Pyext/test/py_u_TestSimulator.py
@@ -115,7 +115,7 @@ if __name__ == "__main__":
     test_time_series()
     
     # traverse the CSim test data, make sure python simulation matches c++
-    workspace_dir = Test.get_root_source_dir()
+    workspace_dir = ecflow.File.source_dir()
     csim_test_data = workspace_dir + "/CSim/test/data/good_defs"
     print (csim_test_data)
     for path in Test.all_files(csim_test_data,'*.def'):
diff --git a/Pyext/test/py_u_TestTraversal.py b/Pyext/test/py_u_TestTraversal.py
index 2f89150..9e676c5 100644
--- a/Pyext/test/py_u_TestTraversal.py
+++ b/Pyext/test/py_u_TestTraversal.py
@@ -209,13 +209,13 @@ if __name__ == "__main__":
     # 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" )
+        newpath = os.path.join( os.path.dirname(cwd),"ANode/parser/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")
+    #mega_def = os.path.join( os.path.dirname(cwd), "ANode/parser/test/data/single_defs/mega.def")
     #check_traversal(mega_def)
     print("All Tests pass")    
\ No newline at end of file
diff --git a/README b/README
index fbbae0d..a52e5ba 100644
--- a/README
+++ b/README
@@ -5,10 +5,8 @@
 * dependencies
 
    - PYTHON_API:
-     python 2.7,  Python 3.0 not tested. 
+     python 2.7,  Python 3.0 not fully 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
      
    - ecflowview:
@@ -22,7 +20,7 @@
 * ecfFlow consists of two tar files i.e. :
    
    - boost_1_53_0.tar.gz
-   - ecFlow-4.1.0-Source.tar.gz
+   - ecFlow-4.7.0-Source.tar.gz
    
 * Create a directory for the build::
 
@@ -33,16 +31,16 @@
 * Un-zip then un-tar the two file files::
 
   > tar -zxf boost_1_53_0.tar.gz
-  > tar -zxf ecFlow-4.1.0-Source.tar.gz
+  > tar -zxf ecFlow-4.7.0-Source.tar.gz
    
 * You should have two directories created::
 
    - boost_1_53_0
-   - ecFlow-4.1.0-Source
+   - ecFlow-4.7.0-Source
     
 * Create two environment variables. These are used by some of scripts::
 
-  > export WK=/tmp/ecflow_build/ecFlow-4.1.0-Source
+  > export WK=/tmp/ecflow_build/ecFlow-4.7.0-Source
   > export BOOST_ROOT=/tmp/ecflow_build/boost_1_53_0
    
 * There are two ways of building ecflow, boost-build/bjam or cmake
@@ -100,7 +98,7 @@ ecflowview
 cmake
 =====================================================================
 * By default will install /usr/local, hence may require root access rights
-  > cd /tmp/ecflow_build/ecFlow-4.1.0-Source
+  > cd /tmp/ecflow_build/ecFlow-4.7.0-Source
   > mkdir build; cd build
   > cmake ..  
   > make -j2
@@ -110,7 +108,7 @@ cmake
 
 * Optionally you can specify install prefix directory:
 
-  > cd /tmp/ecflow_build/ecFlow-4.1.0-Source
+  > cd /tmp/ecflow_build/ecFlow-4.7.0-Source
   > mkdir build; cd build
   > cmake .. -DCMAKE_INSTALL_PREFIX=/var/tmp/$USER/install/cmake/ecflow 
   > make -j2
@@ -119,7 +117,7 @@ cmake
 
 * Optionally if you do *NOT* want to build the GUI(ecflowview) or UI(ecflow_ui) or Python api:
 
-  > cd /tmp/ecflow_build/ecFlow-4.1.0-Source
+  > cd /tmp/ecflow_build/ecFlow-4.7.0-Source
   > mkdir build; cd build
   > cmake .. -DCMAKE_INSTALL_PREFIX=/var/tmp/$USER/install/cmake/ecflow \
              -DENABLE_GUI=OFF           \
@@ -131,7 +129,7 @@ cmake
 
 * Optionally if you did not export BOOST_ROOT you can specify on the command line:
 
-  > cd /tmp/ecflow_build/ecFlow-4.1.0-Source
+  > cd /tmp/ecflow_build/ecFlow-4.7.0-Source
   > mkdir build; cd build
   > cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/apps/ecflow \
              -DCMAKE_BUILD_TYPE=Debug \
@@ -142,7 +140,7 @@ cmake
 
 * On some platforms(AIX) you may need to specify the c++ compiler
 
-  > cd /tmp/ecflow_build/ecFlow-4.1.0-Source
+  > cd /tmp/ecflow_build/ecFlow-4.7.0-Source
   > mkdir build; cd build
   > cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/apps/ecflow \
              -DCMAKE_CXX_COMPILER=xlC_r"
@@ -173,11 +171,15 @@ boost/bjam:  This can not build the new UI(ecflow_ui)
   > cd $WK
   > bjam c++-template-depth=512 variant=release install-all
   
+  using boost 1.53 with gcc 4.8, will have excessive warnings. To prune these warnings use:
+  > bjam c++-template-depth=512 cxxflags=-Wno-unused-local-typedefs variant=release
+  
   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
@@ -187,6 +189,7 @@ boost/bjam:  This can not build the new UI(ecflow_ui)
      <ECFLOW_INSTALL_DIR>/bin
      <ECFLOW_INSTALL_DIR>/lib
      <ECFLOW_INSTALL_DIR>/doc
+     <ECFLOW_INSTALL_DIR>/share
      <ECFLOW_PYTHON_INSTALL_DIR> 
       
   Depending on your umask setting you may need to call chmod 755 on the executables  
@@ -195,4 +198,23 @@ boost/bjam:  This can not build the new UI(ecflow_ui)
   PYTHONPATH and LD_LIBRARY_PATH
   
       export PYTHONPATH=$PYTHONPATH:$ECFLOW_PYTHON_INSTALL_DIR
-      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ECFLOW_PYTHON_INSTALL_DIR
\ No newline at end of file
+      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ECFLOW_PYTHON_INSTALL_DIR
+      
+      
+Ecflowview
+==========
+* By default the ecflowview 'server' and ecflowview.menu files are placed in  the share/ecflow directory. 
+  However you can use ECFLOWVIEW_HOME shell variable to override this
+ 
+* server file defines the list of servers you want all your users to see in ecflowview. 
+  It has a very simple format. For each ecflow server add a line like
+     
+     <server_name> <machine_name> <port>
+     
+* ECFLOWRC variable may be set to use alternative directory for user ecflowview option files (default is $HOME/.ecflowrc)
+
+ 
+Ecflow uses Semantic versioning
+===============================
+See: http://semver.org/
+
diff --git a/Server/CMakeLists.txt b/Server/CMakeLists.txt
index 1b6908d..1070404 100644
--- a/Server/CMakeLists.txt
+++ b/Server/CMakeLists.txt
@@ -16,13 +16,12 @@ ecbuild_add_library( TARGET libserver
                      NOINSTALL
                      TYPE     STATIC
                      SOURCES  ${srcs}
-                     LIBS     base libparser node nodeattr core
+                     LIBS     base node nodeattr core
                               pthread
                      INCLUDES src
                               ../ACore/src 
                               ../ANattr/src
                               ../ANode/src
-                              ../AParser/src
                               ../Base/src
                               ../Base/src/cts
                               ../Base/src/stc
diff --git a/Server/Jamfile.jam b/Server/Jamfile.jam
index 86e9de7..ae90bef 100644
--- a/Server/Jamfile.jam
+++ b/Server/Jamfile.jam
@@ -15,9 +15,8 @@ project theServer ;
 #
 use-project theCore     : ../ACore ;
 use-project theNodeAttr : ../ANattr ;
-use-project theNode     : ../ANode ;
+use-project theNode     : ../ANode ;  
 use-project theBase     : ../Base ;
-use-project theParser   : ../AParser ;
 
 lib pthread ;
 
@@ -34,7 +33,6 @@ 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
@@ -42,7 +40,6 @@ lib libserver : [ glob src/*.cpp : src/*Main.cpp ]
                 <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
@@ -58,7 +55,6 @@ exe ecflow_server : [ glob src/*Main.cpp ]
              /theCore//core
              /theNodeAttr//nodeattr
              /theNode//node
-             /theParser//libparser
              /theBase//base
              libserver
              /site-config//boost_system
@@ -80,7 +76,6 @@ exe u_server : [ glob test/*.cpp ]
              /theCore//core
              /theNodeAttr//nodeattr
              /theNode//node
-             /theParser//libparser
              /theBase//base
              libserver
              /site-config//boost_system
diff --git a/Server/src/CheckPtSaver.cpp b/Server/src/CheckPtSaver.cpp
index 063422f..4710161 100644
--- a/Server/src/CheckPtSaver.cpp
+++ b/Server/src/CheckPtSaver.cpp
@@ -133,21 +133,11 @@ void CheckPtSaver::explicitSave(bool from_server) const
 			}
 
 			// 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);
-			}
+			server_->defs_->save_as_checkpt(serverEnv_->checkPtFilename());
 
 			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();
diff --git a/Server/src/Server.cpp b/Server/src/Server.cpp
index 60d340f..b406bb6 100644
--- a/Server/src/Server.cpp
+++ b/Server/src/Server.cpp
@@ -343,6 +343,9 @@ void Server::handle_read(  const boost::system::error_code& e,connection_ptr con
          outbound_response_.set_cmd( PreAllocatedReply::error_cmd( e.what()  ));
       }
 
+      // Do any necessary clean up after inbound_request_ has run. i.e like re-claiming memory
+      inbound_request_.cleanup();
+
       // 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
@@ -395,6 +398,9 @@ void Server::handle_write( const boost::system::error_code& e, connection_ptr co
       return;
    }
 
+   // Do any necessary clean up after outbound_response_  has run. i.e like re-claiming memory
+   outbound_response_.cleanup();
+
    (void)shutdown_socket(conn,"Server::handle_write:");
 
    // If asked to terminate we do it here rather than in handle_read.
@@ -510,13 +516,24 @@ bool Server::restore_from_checkpt(const std::string& filename,bool& failed)
       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";
+         defs_->restore(filename);      // this can throw
+         update_defs_server_state();    // works on def_
+         LOG(Log::MSG, "Loading of *DEFS* check point file SUCCEDED. Loaded "<< defs_->suiteVec().size() << " suites");
+         return true;
+      }
+      catch (exception& e) {
+         LOG(Log::ERR, "Failed to load *DEFS* check point file " << filename << ", because: " << e.what());
+         failed = true;
+      }
+
+      try {
+         defs_->boost_restore_from_checkpt(filename);   // this can throw
+         update_defs_server_state();                    // works on def_
+         LOG(Log::MSG, "Loading of *BOOST* check point file SUCCEDED. Loaded "<< defs_->suiteVec().size() << " suites");
          return true;
       }
       catch (exception& e) {
-         LOG(Log::ERR, "Failed to load check point file " << filename << ", because: " << e.what());
+         LOG(Log::ERR, "Failed to *BOOST* check point file " << filename << ", because: " << e.what());
          failed = true;
       }
    }
@@ -550,6 +567,10 @@ void Server::update_defs_server_state()
    defs_->set_server().jobGeneration( serverEnv_.jobGeneration() );
    LOG_ASSERT( defs_->server().jobSubmissionInterval() != 0 ,"");
 
+   // Since we have reloaded Defs, make sure clients, re-sync by resetting change and modify numbers on server
+   defs_->set_state_change_no(Ecf::state_change_no());
+   defs_->set_modify_change_no(Ecf::modify_change_no());
+
    /// System needs defs to handle process that have died, and need to flagged as aborted
    ecf::System::instance()->setDefs(defs_);
 }
diff --git a/Server/src/ServerEnvironment.hpp b/Server/src/ServerEnvironment.hpp
index ea71f80..27ba122 100644
--- a/Server/src/ServerEnvironment.hpp
+++ b/Server/src/ServerEnvironment.hpp
@@ -83,7 +83,7 @@ public:
 	/// 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
+	/// The default is defined by CheckPt::default_save_time_alarm(). 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 ;}
diff --git a/Server/src/ServerOptions.cpp b/Server/src/ServerOptions.cpp
index 32132fa..43124b9 100644
--- a/Server/src/ServerOptions.cpp
+++ b/Server/src/ServerOptions.cpp
@@ -82,7 +82,7 @@ ServerOptions::ServerOptions( int argc, char* argv[],ServerEnvironment* env )
          "        server will expect <host>.<port>.ecf.lists \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"
+         "  This is used to aid debugging of task taking 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"
diff --git a/Server/test/TestServerEnvironment.cpp b/Server/test/TestServerEnvironment.cpp
index a6b7258..39cc0b1 100644
--- a/Server/test/TestServerEnvironment.cpp
+++ b/Server/test/TestServerEnvironment.cpp
@@ -375,7 +375,7 @@ BOOST_AUTO_TEST_CASE( test_server_profile_threshold_environment_variable )
       BOOST_CHECK_THROW(ServerEnvironment serverEnv(argc,argv), std::runtime_error );
    }
 
-   putenv(const_cast<char*>("ECF_TASK_THRESHOLD")); // remove from env, otherwise valgrind complains
+   unsetenv(const_cast<char*>("ECF_TASK_THRESHOLD")); // remove from env, otherwise valgrind complains, *AND* affects other tests
 
    Host h;
    fs::remove(h.ecf_log_file(serverEnv.the_port()));
diff --git a/Test/CMakeLists.txt b/Test/CMakeLists.txt
index 8590176..8ef9b5f 100644
--- a/Test/CMakeLists.txt
+++ b/Test/CMakeLists.txt
@@ -10,13 +10,12 @@ ecbuild_add_library( TARGET   libharness
                      NOINSTALL
                      TYPE     STATIC
                      SOURCES  ${srcs}
-                     LIBS     libclient base libparser node nodeattr core  
+                     LIBS     libclient base node nodeattr core  
                      INCLUDES src
                               ../ACore/src 
                               ../ANattr/src
                               ../ANode/src
                               ../ANode/test
-                              ../AParser/src
                               ../Base/src
                               ../Base/src/cts
                               ../Base/src/stc
diff --git a/Test/Jamfile.jam b/Test/Jamfile.jam
index 5f47365..20a94f9 100644
--- a/Test/Jamfile.jam
+++ b/Test/Jamfile.jam
@@ -12,8 +12,7 @@ project theTest ;
 #
 use-project theCore     : ../ACore ;
 use-project theNodeAttr : ../ANattr ;
-use-project theNode     : ../ANode ;
-use-project theParser   : ../AParser ;
+use-project theNode     : ../ANode  ;  
 use-project theBase     : ../Base ;
 use-project theServer   : ../Server ;
 use-project theClient   : ../Client ;
@@ -30,7 +29,6 @@ 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 
@@ -41,7 +39,6 @@ lib libharness : [ glob src/*.cpp ]
                 <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
@@ -58,7 +55,6 @@ exe s_test : [ glob Test*.cpp : TestSingle.cpp TestZombies.cpp ]
            /theCore//core
            /theNodeAttr//nodeattr
            /theNode//node
-           /theParser//libparser
            /theBase//base
            /theClient//libclient
            libharness
@@ -79,7 +75,6 @@ exe s_test_zombies : [ glob TestZombies.cpp  ]
            /theCore//core
            /theNodeAttr//nodeattr
            /theNode//node
-           /theParser//libparser
            /theBase//base
            /theClient//libclient
            libharness
@@ -100,7 +95,6 @@ exe singletest : [ glob TestSingle.cpp  ]
            /theCore//core
            /theNodeAttr//nodeattr
            /theNode//node
-           /theParser//libparser
            /theBase//base
            /theClient//libclient
            libharness
diff --git a/Test/TestAlias.cpp b/Test/TestAlias.cpp
index 0cc85f2..57a25b4 100644
--- a/Test/TestAlias.cpp
+++ b/Test/TestAlias.cpp
@@ -37,7 +37,6 @@
 #include "DurationTimer.hpp"
 #include "PrintStyle.hpp"
 #include "ClientToServerCmd.hpp"
-#include "DefsStructureParser.hpp"
 #include "AssertTimer.hpp"
 #include "Str.hpp"
 #include "NOrder.hpp"
@@ -131,7 +130,7 @@ BOOST_AUTO_TEST_CASE( test_alias )
 //#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);
+//   PrintStyle style(PrintStyle::STATE);
 //   std::cout << *defs;
 //#endif
 
diff --git a/Test/TestHandle.cpp b/Test/TestHandle.cpp
index 7de74d3..3e91075 100644
--- a/Test/TestHandle.cpp
+++ b/Test/TestHandle.cpp
@@ -32,7 +32,6 @@
 #include "DurationTimer.hpp"
 #include "PrintStyle.hpp"
 #include "ClientToServerCmd.hpp"
-#include "DefsStructureParser.hpp"
 #include "AssertTimer.hpp"
 
 using namespace std;
diff --git a/Test/TestLate.cpp b/Test/TestLate.cpp
index ef7c1b4..a06c1e8 100644
--- a/Test/TestLate.cpp
+++ b/Test/TestLate.cpp
@@ -31,7 +31,6 @@
 #include "DurationTimer.hpp"
 #include "PrintStyle.hpp"
 #include "ClientToServerCmd.hpp"
-#include "DefsStructureParser.hpp"
 #include "AssertTimer.hpp"
 
 using namespace std;
diff --git a/Test/TestOrderCmd.cpp b/Test/TestOrderCmd.cpp
index 1e9b867..4bb2e31 100644
--- a/Test/TestOrderCmd.cpp
+++ b/Test/TestOrderCmd.cpp
@@ -32,7 +32,6 @@
 #include "DurationTimer.hpp"
 #include "PrintStyle.hpp"
 #include "ClientToServerCmd.hpp"
-#include "DefsStructureParser.hpp"
 #include "AssertTimer.hpp"
 
 using namespace std;
diff --git a/Test/TestRepeat.cpp b/Test/TestRepeat.cpp
index a390f91..a3134ad 100644
--- a/Test/TestRepeat.cpp
+++ b/Test/TestRepeat.cpp
@@ -281,7 +281,7 @@ BOOST_AUTO_TEST_CASE( test_repeat_clears_user_edit )
    serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_repeat_integer.def"), 40, false /* waitFortestcompletion */);
 
 #ifdef DEBUG_ME
-   PrintStyle::setStyle(PrintStyle::STATE);
+   PrintStyle style(PrintStyle::STATE);
    TestFixture::client().sync_local();
    defs_ptr server_defs = TestFixture::client().defs();
    cout << "At start ============================================\n";
diff --git a/Test/TestSingle.cpp b/Test/TestSingle.cpp
index 67a822b..81ee0c0 100644
--- a/Test/TestSingle.cpp
+++ b/Test/TestSingle.cpp
@@ -33,7 +33,6 @@
 #include "DurationTimer.hpp"
 #include "PrintStyle.hpp"
 #include "ClientToServerCmd.hpp"
-#include "DefsStructureParser.hpp"
 #include "AssertTimer.hpp"
 #include "File.hpp"
 
@@ -56,8 +55,8 @@ 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");
+   std::string log_file = File::test_data("ANode/parser/test/data/single_defs/mega.def_log","parser");
+   std::string path = File::test_data("ANode/parser/test/data/single_defs/mega.def","parser");
 
    cout << "Test:: ..." << path << " log file: " << log_file << flush;
 
@@ -66,9 +65,8 @@ BOOST_AUTO_TEST_CASE( test_mega_def )
 
    // parse in file
    Defs theDefs;
-   DefsStructureParser checkPtParser( &theDefs, path);
    std::string errorMsg,warningMsg;
-   BOOST_REQUIRE_MESSAGE(checkPtParser.doParse(errorMsg,warningMsg),errorMsg);
+   BOOST_REQUIRE_MESSAGE(theDefs.restore(path,errorMsg,warningMsg),errorMsg);
 
    ServerTestHarness serverTestHarness;
    serverTestHarness.check_task_duration_less_than_server_poll(false); // Add variable CHECK_TASK_DURATION_LESS_THAN_SERVER_POLL
diff --git a/Test/TestZombies.cpp b/Test/TestZombies.cpp
index 8210c5b..ef35e93 100644
--- a/Test/TestZombies.cpp
+++ b/Test/TestZombies.cpp
@@ -55,7 +55,6 @@ namespace fs = boost::filesystem;
 // 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
@@ -68,7 +67,7 @@ namespace fs = boost::filesystem;
 //#define DO_TEST10 1 Need to make reliable
 #define DO_TEST11 1
 
-static bool ecf_debug_enabled = false; // allow environment to enable debug
+static bool ecf_debug_enabled = false; // allow environment(ECF_DEBUG_ZOMBIES) to enable debug
 
 
 BOOST_GLOBAL_FIXTURE( TestFixture );
@@ -247,6 +246,7 @@ static void wait_for_path_zombies(int no_of_tasks, int max_time_to_wait)
 
 static void check_expected_no_of_zombies(size_t expected)
 {
+   if (ecf_debug_enabled) cout << "   check_expected_no_of_zombies: " << expected << "\n";
    TestFixture::client().zombieGet();
    std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
 
@@ -261,18 +261,22 @@ static void check_at_least_one_zombie()
 {
    TestFixture::client().zombieGet();
    std::vector<Zombie> zombies = TestFixture::client().server_reply().zombies();
+   if (ecf_debug_enabled) std::cout << "\n   check_at_least_one_zombie: actual " << zombies.size() << "\n";
    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";
+   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 (zombies.empty() ) {
+         if (ecf_debug_enabled) cout << "   zombies empty\n";
+         break;
+      }
 
       if ( assertTimer.duration() >=  assertTimer.timeConstraint() ) {
          if (ecf_debug_enabled)  {
@@ -495,7 +499,7 @@ static void create_and_start_test(const std::string& suite_name, const std::stri
 
 BOOST_AUTO_TEST_CASE( enable_debug_for_ECF_TRY_NO_Greater_than_one)
 {
-   BOOST_CHECK_MESSAGE(!ecf_debug_enabled ,"dummy test");
+   BOOST_CHECK_MESSAGE(true,"dummy test");
 
    if (getenv("ECF_DEBUG_ZOMBIES")) {
       ecf_debug_enabled = true;
@@ -627,6 +631,8 @@ BOOST_AUTO_TEST_CASE( test_user_zombies_for_begin )
    // 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. 
+   //
+   /// When we have two sets of completes, we just fob, automatically. See TaskCmd::authenticate
    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 ?");
 
diff --git a/Test/Test_Time.cpp b/Test/Test_Time.cpp
index d1b1298..c222201 100644
--- a/Test/Test_Time.cpp
+++ b/Test/Test_Time.cpp
@@ -374,7 +374,7 @@ BOOST_AUTO_TEST_CASE( test_single_real_time_near_midnight )
 #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);
+   PrintStyle style(PrintStyle::STATE);
    std::cout << *defs;
 #endif
 
@@ -442,7 +442,7 @@ BOOST_AUTO_TEST_CASE( test_time_real_series_near_midnight )
 #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);
+   PrintStyle style(PrintStyle::STATE);
    std::cout << *defs;
 #endif
 
diff --git a/Test/src/ServerTestHarness.cpp b/Test/src/ServerTestHarness.cpp
index 57b3771..4504d4f 100644
--- a/Test/src/ServerTestHarness.cpp
+++ b/Test/src/ServerTestHarness.cpp
@@ -32,7 +32,6 @@
 #include "File.hpp"
 #include "AssertTimer.hpp"
 #include "TestHelper.hpp"
-#include "PrintStyle.hpp"
 #include "WhyCmd.hpp"
 #include "Ecf.hpp"
 #include "Str.hpp"
@@ -50,7 +49,8 @@ ServerTestHarness::ServerTestHarness()
 : generateManFileForNodeContainers_(false),
   check_task_duration_less_than_server_poll_(true),
   add_default_sleep_time_(true),
-  serverUpdateCalendarCount_(0)
+  serverUpdateCalendarCount_(0),
+  print_style_(PrintStyle::STATE)
 {}
 
 void ServerTestHarness::run(
@@ -160,9 +160,8 @@ ServerTestHarness::doRun(Defs& theClientDefs, const std::map<std::string,std::st
          load_defs_from_disk = false;
       }
       else {
-         PrintStyle::setStyle(PrintStyle::DEFS); // needed for output
+         PrintStyle style(PrintStyle::DEFS); // needed for output
          theClientDefsFile << theClientDefs;
-         PrintStyle::setStyle(PrintStyle::STATE); // From now on show state
       }
    }
 
@@ -255,6 +254,7 @@ ServerTestHarness::testWaiter( const Defs& theClientDefs, int timeout, bool veri
    std::string dump_defs_filename = "test.def";
    int counter = 0;
 #endif
+   DebugEquality debug_equality; // only as affect in DEBUG build
 
    BOOST_REQUIRE_MESSAGE(TestFixture::client().client_handle() == 0,"Client handle expected to be zero but found " << TestFixture::client().client_handle());
 
@@ -319,12 +319,10 @@ ServerTestHarness::testWaiter( const Defs& theClientDefs, int timeout, bool veri
             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
@@ -340,8 +338,6 @@ ServerTestHarness::testWaiter( const Defs& theClientDefs, int timeout, bool veri
 
 #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() );
@@ -376,7 +372,6 @@ ServerTestHarness::testWaiter( const Defs& theClientDefs, int timeout, bool veri
             theFile << "submitted: " << submitted << "\n";
             theFile << "active: " << active << "\n";
             theFile << *full_defs.get();
-            PrintStyle::setStyle(st);
          }
 #endif
          std::string errorMsg;
diff --git a/Test/src/ServerTestHarness.hpp b/Test/src/ServerTestHarness.hpp
index 93298e7..036deee 100644
--- a/Test/src/ServerTestHarness.hpp
+++ b/Test/src/ServerTestHarness.hpp
@@ -21,6 +21,7 @@
 #include <map>
 #include "NodeFwd.hpp"
 #include "ZombieUtil.hpp"
+#include "PrintStyle.hpp"
 class ClientInvoker;
 
 // This class provides a test harness for running defs file in a client server environment
@@ -105,5 +106,6 @@ private:
 	bool add_default_sleep_time_;
 	int serverUpdateCalendarCount_;
 	std::string defs_filename_;
+	PrintStyle print_style_; // by default show state when writing defs to standard out. RAII
 };
 #endif
diff --git a/Test/src/TestFixture.cpp b/Test/src/TestFixture.cpp
index 7d267b7..08e4499 100644
--- a/Test/src/TestFixture.cpp
+++ b/Test/src/TestFixture.cpp
@@ -66,12 +66,12 @@ namespace fs = boost::filesystem;
 //#define DEBUG_HOST_SERVER 1
 #define DEBUG_LOCAL_SERVER 1
 
-TestFixture::TestFixture(const std::string& project_test_dir)
+TestFixture::TestFixture(const std::string& project_test_dir) : print_style_(PrintStyle::STATE)
 {
    init(project_test_dir);
 }
 
-TestFixture::TestFixture()
+TestFixture::TestFixture() : print_style_(PrintStyle::STATE)
 {
    init("Test");
 }
@@ -96,7 +96,6 @@ void TestFixture::init(const std::string& project_test_dir)
    // ********************************************************
    // Note: Global fixture Constructor can not use BOOST macro
    // ********************************************************
-   PrintStyle::setStyle(PrintStyle::STATE);
 
    // Let first see if we need do anything. If ECF_HOST is specified (ie the name
    // of the machine, which has the ecflow server), only then do we need to do anything.
diff --git a/Test/src/TestFixture.hpp b/Test/src/TestFixture.hpp
index 4b82f25..618b9d3 100644
--- a/Test/src/TestFixture.hpp
+++ b/Test/src/TestFixture.hpp
@@ -23,8 +23,10 @@
 // i.e order of initialisation issues
 //============================================================================
 
-#include "ClientInvoker.hpp"
 #include <string>
+#include "ClientInvoker.hpp"
+#include "PrintStyle.hpp"
+
 class Defs;
 
 //
@@ -98,6 +100,7 @@ private:
 	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"
+   PrintStyle print_style_; // by default show state when writing defs to standard out. RAII
 };
 
 #endif
diff --git a/VERSION.cmake b/VERSION.cmake
index e2a200d..08f69ca 100644
--- a/VERSION.cmake
+++ b/VERSION.cmake
@@ -1,7 +1,7 @@
 set( ECFLOW_RELEASE  "4" )
-set( ECFLOW_MAJOR    "6" )
-set( ECFLOW_MINOR    "1" )
+set( ECFLOW_MAJOR    "7" )
+set( ECFLOW_MINOR    "0" )
 
 # use this form to be consistent with other packages,+ allow standard extraction of version from scripts
 # could replaced "4.0.8" with "${ECFLOW_RELEASE}.${ECFLOW_MAJOR}.${ECFLOW_MINOR}"
-set( ${PROJECT_NAME}_VERSION_STR  "4.6.1" )
+set( ${PROJECT_NAME}_VERSION_STR  "4.7.0" )
diff --git a/Viewer/images/cogwheel_blue.svg b/Viewer/images/cogwheel_blue.svg
new file mode 100644
index 0000000..b931747
--- /dev/null
+++ b/Viewer/images/cogwheel_blue.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="cogwheel_blue.svg">
+  <defs
+     id="defs15">
+    <linearGradient
+       id="linearGradient3762">
+      <stop
+         style="stop-color:#e4ca38;stop-opacity:1;"
+         offset="0"
+         id="stop3764" />
+      <stop
+         style="stop-color:#feb42e;stop-opacity:1;"
+         offset="1"
+         id="stop3766" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="954"
+     inkscape:window-height="1141"
+     id="namedview13"
+     showgrid="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:zoom="15.353691"
+     inkscape:cx="3.4608106"
+     inkscape:cy="15.644701"
+     inkscape:window-x="960"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="layer1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2992"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata4083">image/svg+xml<rdf:RDF>
+  <cc:Work
+     rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type
+       rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+    <dc:title></dc:title>
+    <cc:license
+       rdf:resource="" />
+  </cc:Work>
+</rdf:RDF>
+</metadata>
+  <g
+     id="g7"
+     transform="matrix(0.07691065,0,0,0.07691085,1.0927959,0.98000587)"
+     style="fill:#ff9955">
+    <title
+       id="title9">Layer 1</title>
+    <g
+       id="layer1"
+       style="fill:#ff9955">
+      <path
+         d="m 179.97914,6.0810187 -7.75457,43.6685953 0.0305,0.02923 c -9.47919,1.531405 -18.65011,3.985597 -27.40966,7.254054 l 0,-0.02926 -28.78113,-33.99812 -27.051764,15.450686 15.360254,41.634313 0.0593,0.02928 C 97.098295,86.071717 90.376404,92.740748 84.359814,99.993878 L 84.330294,99.905145 42.217022,84.7196 26.588587,111.46369 60.976876,139.94766 c -3.300345,8.65237 -5.76082,17.70578 -7.306954,27.06772 l -0.03054,-0.0293 -44.170955,7.66636 0,30.90138 44.170955,7.66636 0.03054,-0 [...]
+         id="path4050"
+         stroke-miterlimit="4"
+         inkscape:connector-curvature="0"
+         style="fill:#164450;fill-opacity:1;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0"
+         sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccsssss" />
+    </g>
+  </g>
+</svg>
diff --git a/Viewer/images/dependency.svg b/Viewer/images/dependency.svg
new file mode 100644
index 0000000..c0d1855
--- /dev/null
+++ b/Viewer/images/dependency.svg
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="dependency.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3756">
+      <stop
+         id="stop3758"
+         offset="0"
+         style="stop-color:#519aed;stop-opacity:1;" />
+      <stop
+         id="stop3760"
+         offset="1"
+         style="stop-color:#e9dddd;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3728">
+      <stop
+         style="stop-color:#f1f3fb;stop-opacity:1;"
+         offset="0"
+         id="stop3730" />
+      <stop
+         style="stop-color:#273df9;stop-opacity:0;"
+         offset="1"
+         id="stop3732" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3614">
+      <stop
+         style="stop-color:#2c71d9;stop-opacity:1;"
+         offset="0"
+         id="stop3616" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1;"
+         offset="1"
+         id="stop3618" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3602">
+      <stop
+         style="stop-color:#f5f5f5;stop-opacity:1;"
+         offset="0"
+         id="stop3604" />
+      <stop
+         style="stop-color:#141bc6;stop-opacity:1;"
+         offset="1"
+         id="stop3606" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3614"
+       id="linearGradient3691"
+       gradientUnits="userSpaceOnUse"
+       x1="15.413333"
+       y1="12.89746"
+       x2="15.413333"
+       y2="31.085577" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3602"
+       id="linearGradient3693"
+       gradientUnits="userSpaceOnUse"
+       x1="15.413333"
+       y1="2.2337441"
+       x2="15.413333"
+       y2="31.085577" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3728"
+       id="linearGradient3710"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0688752,0,0,-1.1672542,-31.566354,35.860667)"
+       x1="15.413333"
+       y1="3.4795053"
+       x2="15.941438"
+       y2="18.883736" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3756"
+       id="linearGradient3720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0688752,0,0,-1.1672542,-31.566354,35.860667)"
+       x1="24.437176"
+       y1="3.4853487"
+       x2="15.941438"
+       y2="18.883736" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.75"
+     inkscape:cx="-0.75795397"
+     inkscape:cy="15.420625"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="true"
+     inkscape:snap-grids="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1175"
+     inkscape:window-x="1920"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-to-guides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2816"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+        <cc:license
+           rdf:resource="Apache License 2.0" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:creator>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>ECMWF</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:language>en-GB</dc:language>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>Metview icon</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:description>Metview icon</dc:description>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="bg"
+     style="display:inline" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="item"
+     style="display:inline">
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-weight:normal;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Calibri;-inkscape-font-specification:Calibri"
+       x="3.8399999"
+       y="21.973333"
+       id="text3783"><tspan
+         sodipodi:role="line"
+         id="tspan3785"
+         x="3.8399999"
+         y="21.973333" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="7.2533331"
+       y="15.146667"
+       id="text3787"><tspan
+         sodipodi:role="line"
+         id="tspan3789"
+         x="7.2533331"
+         y="15.146667" /></text>
+    <ellipse
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#6f8a91;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="path4793"
+       cx="16.49"
+       cy="16.257975"
+       rx="11.25"
+       ry="11.250001" />
+    <circle
+       style="opacity:1;fill:#536c67;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="path4801"
+       cx="10.576823"
+       cy="6.9302993"
+       r="4.5" />
+    <circle
+       r="4.5"
+       cy="25.010298"
+       cx="8.7634897"
+       id="circle4811"
+       style="opacity:1;fill:#536c67;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <circle
+       style="opacity:1;fill:#536c67;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="circle4813"
+       cx="26.790157"
+       cy="18.983633"
+       r="4.5" />
+  </g>
+</svg>
diff --git a/Viewer/images/dependency_detail.svg b/Viewer/images/dependency_detail.svg
new file mode 100644
index 0000000..b57ed85
--- /dev/null
+++ b/Viewer/images/dependency_detail.svg
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="dependency_detail.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3756">
+      <stop
+         id="stop3758"
+         offset="0"
+         style="stop-color:#519aed;stop-opacity:1;" />
+      <stop
+         id="stop3760"
+         offset="1"
+         style="stop-color:#e9dddd;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3728">
+      <stop
+         style="stop-color:#f1f3fb;stop-opacity:1;"
+         offset="0"
+         id="stop3730" />
+      <stop
+         style="stop-color:#273df9;stop-opacity:0;"
+         offset="1"
+         id="stop3732" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3614">
+      <stop
+         style="stop-color:#2c71d9;stop-opacity:1;"
+         offset="0"
+         id="stop3616" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1;"
+         offset="1"
+         id="stop3618" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3602">
+      <stop
+         style="stop-color:#f5f5f5;stop-opacity:1;"
+         offset="0"
+         id="stop3604" />
+      <stop
+         style="stop-color:#141bc6;stop-opacity:1;"
+         offset="1"
+         id="stop3606" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3614"
+       id="linearGradient3691"
+       gradientUnits="userSpaceOnUse"
+       x1="15.413333"
+       y1="12.89746"
+       x2="15.413333"
+       y2="31.085577" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3602"
+       id="linearGradient3693"
+       gradientUnits="userSpaceOnUse"
+       x1="15.413333"
+       y1="2.2337441"
+       x2="15.413333"
+       y2="31.085577" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3728"
+       id="linearGradient3710"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0688752,0,0,-1.1672542,-31.566354,35.860667)"
+       x1="15.413333"
+       y1="3.4795053"
+       x2="15.941438"
+       y2="18.883736" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3756"
+       id="linearGradient3720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0688752,0,0,-1.1672542,-31.566354,35.860667)"
+       x1="24.437176"
+       y1="3.4853487"
+       x2="15.941438"
+       y2="18.883736" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.75"
+     inkscape:cx="-0.6512873"
+     inkscape:cy="15.313958"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="true"
+     inkscape:snap-grids="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1144"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-to-guides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2816"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <cc:license
+           rdf:resource="Apache License 2.0" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:creator>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>ECMWF</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:language>en-GB</dc:language>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>Metview icon</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:description>Metview icon</dc:description>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="bg"
+     style="display:inline" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="item"
+     style="display:inline">
+    <rect
+       style="opacity:1;fill:#b7c4c8;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4157"
+       width="14.879999"
+       height="32.16"
+       x="17.173336"
+       y="-32.16"
+       ry="0"
+       rx="0"
+       transform="matrix(0,1,-1,0,0,0)" />
+    <rect
+       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#373e48;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4200"
+       width="15.439999"
+       height="16.693335"
+       x="0.5066669"
+       y="0.49333337" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-weight:normal;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Calibri;-inkscape-font-specification:Calibri"
+       x="3.8399999"
+       y="21.973333"
+       id="text3783"><tspan
+         sodipodi:role="line"
+         id="tspan3785"
+         x="3.8399999"
+         y="21.973333" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="7.2533331"
+       y="15.146667"
+       id="text3787"><tspan
+         sodipodi:role="line"
+         id="tspan3789"
+         x="7.2533331"
+         y="15.146667" /></text>
+    <rect
+       style="display:inline;opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#373e48;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4200-1"
+       width="15.706667"
+       height="16.693335"
+       x="15.919999"
+       y="0.52000034" />
+    <rect
+       y="0.49333331"
+       x="0.45333374"
+       height="31.146667"
+       width="31.226664"
+       id="rect4192"
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#373e48;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/Viewer/images/dock_dependency.svg b/Viewer/images/dock_dependency.svg
new file mode 100644
index 0000000..2d18fd3
--- /dev/null
+++ b/Viewer/images/dock_dependency.svg
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="dock_dependency.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3756">
+      <stop
+         id="stop3758"
+         offset="0"
+         style="stop-color:#519aed;stop-opacity:1;" />
+      <stop
+         id="stop3760"
+         offset="1"
+         style="stop-color:#e9dddd;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3728">
+      <stop
+         style="stop-color:#f1f3fb;stop-opacity:1;"
+         offset="0"
+         id="stop3730" />
+      <stop
+         style="stop-color:#273df9;stop-opacity:0;"
+         offset="1"
+         id="stop3732" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3614">
+      <stop
+         style="stop-color:#2c71d9;stop-opacity:1;"
+         offset="0"
+         id="stop3616" />
+      <stop
+         style="stop-color:#ececec;stop-opacity:1;"
+         offset="1"
+         id="stop3618" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3602">
+      <stop
+         style="stop-color:#f5f5f5;stop-opacity:1;"
+         offset="0"
+         id="stop3604" />
+      <stop
+         style="stop-color:#141bc6;stop-opacity:1;"
+         offset="1"
+         id="stop3606" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3614"
+       id="linearGradient3691"
+       gradientUnits="userSpaceOnUse"
+       x1="15.413333"
+       y1="12.89746"
+       x2="15.413333"
+       y2="31.085577" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3602"
+       id="linearGradient3693"
+       gradientUnits="userSpaceOnUse"
+       x1="15.413333"
+       y1="2.2337441"
+       x2="15.413333"
+       y2="31.085577" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3728"
+       id="linearGradient3710"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0688752,0,0,-1.1672542,-31.566354,35.860667)"
+       x1="15.413333"
+       y1="3.4795053"
+       x2="15.941438"
+       y2="18.883736" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3756"
+       id="linearGradient3720"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0688752,0,0,-1.1672542,-31.566354,35.860667)"
+       x1="24.437176"
+       y1="3.4853487"
+       x2="15.941438"
+       y2="18.883736" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.75"
+     inkscape:cx="4.4592193"
+     inkscape:cy="15.313958"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="true"
+     inkscape:snap-grids="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1144"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-to-guides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2816"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+        <cc:license
+           rdf:resource="Apache License 2.0" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:creator>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>ECMWF</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:language>en-GB</dc:language>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>Metview icon</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:description>Metview icon</dc:description>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="bg"
+     style="display:inline" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="item"
+     style="display:inline">
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-weight:normal;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Calibri;-inkscape-font-specification:Calibri"
+       x="3.8399999"
+       y="21.973333"
+       id="text3783"><tspan
+         sodipodi:role="line"
+         id="tspan3785"
+         x="3.8399999"
+         y="21.973333" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="7.2533331"
+       y="15.146667"
+       id="text3787"><tspan
+         sodipodi:role="line"
+         id="tspan3789"
+         x="7.2533331"
+         y="15.146667" /></text>
+    <ellipse
+       style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ececec;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="path4793"
+       cx="16.49"
+       cy="16.257975"
+       rx="11.25"
+       ry="11.250001" />
+    <circle
+       style="opacity:1;fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="path4801"
+       cx="10.576823"
+       cy="6.9302993"
+       r="4.5" />
+    <circle
+       r="4.5"
+       cy="25.010298"
+       cx="8.7634897"
+       id="circle4811"
+       style="opacity:1;fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <circle
+       style="opacity:1;fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="circle4813"
+       cx="26.790157"
+       cy="18.983633"
+       r="4.5" />
+  </g>
+</svg>
diff --git a/Viewer/images/expression.svg b/Viewer/images/expression.svg
new file mode 100644
index 0000000..9702831
--- /dev/null
+++ b/Viewer/images/expression.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="expression.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="18.75"
+     inkscape:cx="30.09894"
+     inkscape:cy="15.207291"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="true"
+     inkscape:snap-grids="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1144"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:snap-to-guides="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2816"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+        <cc:license
+           rdf:resource="Apache License 2.0" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:creator>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>ECMWF</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:language>en-GB</dc:language>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>Metview icon</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:description>Metview icon</dc:description>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <text
+     xml:space="preserve"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     x="0.84000015"
+     y="23.266668"
+     id="text4177"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4179"
+       x="0.84000015"
+       y="23.266668">{e}</tspan></text>
+</svg>
diff --git a/Viewer/images/menu.svg b/Viewer/images/menu.svg
new file mode 100644
index 0000000..03ca474
--- /dev/null
+++ b/Viewer/images/menu.svg
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2458"
+   sodipodi:version="0.32"
+   inkscape:version="0.91 r13725"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"
+   sodipodi:docname="menu.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0">
+  <defs
+     id="defs2460">
+    <linearGradient
+       id="linearGradient18283">
+      <stop
+         style="stop-color:#b3dff1;stop-opacity:1;"
+         offset="0"
+         id="stop18285" />
+      <stop
+         style="stop-color:#f5f5f5;stop-opacity:1"
+         offset="1"
+         id="stop18287" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.412504"
+     inkscape:cx="2.6015714"
+     inkscape:cy="15.836738"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1175"
+     inkscape:window-x="1920"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:snap-grids="false"
+     inkscape:snap-to-guides="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3243" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+        <cc:license
+           rdf:resource="Apache License 2.0" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:creator>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>ECMWF</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:language>en-GB</dc:language>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>Metview icon</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:description>Metview icon</dc:description>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer5"
+     inkscape:label="inner"
+     style="display:inline" />
+  <g
+     id="layer1"
+     inkscape:label="handler"
+     inkscape:groupmode="layer"
+     style="display:inline">
+    <rect
+       style="opacity:1;fill:#6874a2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4146"
+       width="17.886728"
+       height="2.8096414"
+       x="7.3250384"
+       y="8.2239828"
+       ry="0" />
+    <rect
+       ry="0"
+       y="14.515994"
+       x="7.3250384"
+       height="2.8096414"
+       width="17.886728"
+       id="rect4166"
+       style="opacity:1;fill:#6874a2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       style="opacity:1;fill:#6874a2;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4168"
+       width="17.886728"
+       height="2.8096414"
+       x="7.2854662"
+       y="21.322449"
+       ry="0" />
+    <circle
+       style="fill:none;stroke:#4b5479;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="path2468"
+       cx="16.036423"
+       cy="15.845808"
+       r="14.643575" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="frame"
+     style="display:inline" />
+</svg>
diff --git a/Viewer/images/reload_black.svg b/Viewer/images/reload_green.svg
similarity index 62%
rename from Viewer/images/reload_black.svg
rename to Viewer/images/reload_green.svg
index 304fd7a..ebd6e0f 100644
--- a/Viewer/images/reload_black.svg
+++ b/Viewer/images/reload_green.svg
@@ -14,7 +14,7 @@
    height="32"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.91 r13725"
    sodipodi:docname="reload_black.svg">
   <defs
      id="defs4">
@@ -78,7 +78,7 @@
        xlink:href="#linearGradient3728"
        id="linearGradient3710"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1066784,0,0,-1.2085368,0.23065739,37.26001)"
+       gradientTransform="matrix(1.2673621,0,0,-1.382549,-2.5815883,40.899397)"
        x1="15.413333"
        y1="3.4795053"
        x2="15.941438"
@@ -88,7 +88,7 @@
        xlink:href="#linearGradient3756"
        id="linearGradient3720"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1066784,0,0,-1.2085368,0.23065739,37.26001)"
+       gradientTransform="matrix(1.2673621,0,0,-1.382549,-2.5815883,40.899397)"
        x1="24.437176"
        y1="3.4853487"
        x2="15.941438"
@@ -103,26 +103,6 @@
        y2="16.374115"
        gradientUnits="userSpaceOnUse"
        gradientTransform="matrix(1.0279887,0,0,1.0323478,7.1553463,-2.2096664)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3799"
-       id="linearGradient3834"
-       x1="-9.2158766"
-       y1="17.617861"
-       x2="36.303471"
-       y2="17.617861"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.59369669,0,0,0.71540403,-20.45848,-2.9306599)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3852"
-       id="linearGradient3858"
-       x1="4.4050612"
-       y1="16.300755"
-       x2="23.332099"
-       y2="16.521188"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.96778437,0,0,0.96778437,-37.008342,-1.5339029)" />
   </defs>
   <sodipodi:namedview
      id="base"
@@ -131,18 +111,18 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="18.75"
-     inkscape:cx="17.293648"
-     inkscape:cy="19.834875"
+     inkscape:zoom="13.258252"
+     inkscape:cx="23.178095"
+     inkscape:cy="25.223051"
      inkscape:document-units="px"
      inkscape:current-layer="layer2"
      showgrid="true"
      inkscape:snap-grids="false"
-     inkscape:window-width="1354"
-     inkscape:window-height="920"
-     inkscape:window-x="476"
-     inkscape:window-y="405"
-     inkscape:window-maximized="0">
+     inkscape:window-width="1920"
+     inkscape:window-height="1175"
+     inkscape:window-x="1920"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1">
     <inkscape:grid
        type="xygrid"
        id="grid2816"
@@ -188,8 +168,8 @@
      inkscape:label="circle"
      style="display:inline">
     <path
-       style="fill:url(#linearGradient3710);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3720);stroke-width:1.03536737;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
-       d="m 3.2264279,23.061819 c -2.1124368,6.24846 -1.0562184,3.12423 0,0 z"
+       style="fill:url(#linearGradient3710);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3720);stroke-width:1.03536737;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 0.84915187,24.656867 c -2.41915117,7.14815 -1.2095756,3.574076 0,0 z"
        id="path3695"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cc" />
@@ -200,28 +180,16 @@
      inkscape:label="item"
      style="display:inline">
     <path
-       id="path3823"
-       style="fill:url(#linearGradient3834);fill-opacity:1;stroke:#204725;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="m -5.5889072,15.162902 c -2.9220801,3.124593 -7.9079608,3.364869 -11.1362768,0.536674 -1.453377,-1.273244 -2.302764,-2.951335 -2.530799,-4.696796 -0.278489,-2.1316457 0.36974,-4.3637706 1.976309,-6.0816818 2.92208,-3.1245929 7.9079607,-3.3648705 11.1362767,-0.5366746 0.028925,0.02534 -3.729019,4.4775529 -3.700486,4.5032995 L 1.8350164,7.9522945 1.3859484,-4.5671748 -2.4976793,-0.00748502 C -8.127648,-4.9396697 -16.82269,-4.520642 -21.918602,0.92843966 -27.014514,6.3775206 -26.5 [...]
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cssssccccssc" />
-    <path
-       style="fill:url(#linearGradient3858);fill-opacity:1;stroke:none"
-       d="m -23.374716,3.5654787 c -7.929719,0.2332533 -13.582646,9.9733743 -6.983739,17.4109793 0.804509,0.77647 3.881331,2.771417 7.503886,2.500239 6.076112,-0.400327 7.297181,-3.115105 6.816734,-3.219652 -1.211698,-0.26367 -1.183604,1.747421 -6.623135,2.069363 -8.116249,-1.227985 -11.343239,-10.141043 -4.462415,-15.0434116 1.609257,-0.962255 3.116069,-1.5700954 4.679822,-1.6487606 1.84087,-0.092606 3.760651,0.5481345 6.019369,2.2073269 -0.388466,-2.7287525 -3.344813,-3.9428274 -6.9505 [...]
-       id="path3844"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccsccscc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 23.360001,24.32 c 0,0 -4.532571,4.312499 -11.146668,2.613333 -3.6333,-0.933397 -6.9299918,-5.247308 -7.4666663,-8.96 C 4.238375,14.456992 5.80793,10.608258 8.48,8.2666667 c 2.919613,-2.5585192 6.097124,-3.0763881 9.066666,-2.56 4.526192,0.7870815 7.146667,4.7466663 7.146667,4.7466663"
+       style="fill:none;stroke:#008000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 24.094732,24.875582 c 0,0 -5.081649,4.776413 -12.496979,2.89446 C 7.5243135,26.736236 3.8282598,21.958258 3.2265725,17.846176 2.6567061,13.951567 4.4163974,9.6888075 7.4121628,7.0953214 10.685458,4.261571 14.247893,3.6879926 17.577167,4.259931 c 5.074496,0.8717512 8.012416,5.2572869 8.012416,5.2572869"
        id="path3010"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cssssc" />
     <path
-       style="fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       inkscape:transform-center-x="0.55689782"
-       inkscape:transform-center-y="-0.92757219"
-       d="M 19.262467,14.977119 28.621559,5.1983492 29.27707,14.973173 z"
+       style="fill:#008000;fill-opacity:1;fill-rule:evenodd;stroke:#008000"
+       inkscape:transform-center-x="0.63775631"
+       inkscape:transform-center-y="-1.0611297"
+       d="M 18.626869,13.861418 31.264853,4.5413113 29.935538,15.136904 Z"
        id="path3012"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cccc" />
diff --git a/Viewer/images/reload_one.svg b/Viewer/images/reload_one.svg
index 12cce8c..cf7aa7b 100644
--- a/Viewer/images/reload_one.svg
+++ b/Viewer/images/reload_one.svg
@@ -14,7 +14,7 @@
    height="32"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.91 r13725"
    sodipodi:docname="reload_one.svg">
   <defs
      id="defs4">
@@ -78,7 +78,7 @@
        xlink:href="#linearGradient3728"
        id="linearGradient3710"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1886899,0,0,-1.2899296,-0.54032111,39.211527)"
+       gradientTransform="matrix(1.1886899,0,0,-1.2899296,-0.91365444,39.211527)"
        x1="15.413333"
        y1="3.4795053"
        x2="15.941438"
@@ -88,7 +88,7 @@
        xlink:href="#linearGradient3756"
        id="linearGradient3720"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1886899,0,0,-1.2899296,-0.54032111,39.211527)"
+       gradientTransform="matrix(1.1886899,0,0,-1.2899296,-0.91365444,39.211527)"
        x1="24.437176"
        y1="3.4853487"
        x2="15.941438"
@@ -112,7 +112,7 @@
        x2="36.303471"
        y2="17.617861"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6376932,0,0,0.76358518,6.7967495,3.2589676)" />
+       gradientTransform="matrix(0.6376932,0,0,0.76358518,6.4234162,3.2589676)" />
     <linearGradient
        inkscape:collect="always"
        xlink:href="#linearGradient3852"
@@ -122,7 +122,7 @@
        x2="23.332099"
        y2="16.521188"
        gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.039503,0,0,1.0329629,0.64943116,0.59425139)" />
+       gradientTransform="matrix(1.039503,0,0,1.0329629,0.27609783,0.59425139)" />
   </defs>
   <sodipodi:namedview
      id="base"
@@ -132,16 +132,16 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="18.75"
-     inkscape:cx="8.20671"
-     inkscape:cy="19.861541"
+     inkscape:cx="10.906667"
+     inkscape:cy="19.754874"
      inkscape:document-units="px"
      inkscape:current-layer="layer2"
      showgrid="true"
      inkscape:snap-grids="false"
      inkscape:window-width="1920"
-     inkscape:window-height="1140"
-     inkscape:window-x="-4"
-     inkscape:window-y="-4"
+     inkscape:window-height="1144"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
      inkscape:window-maximized="1">
     <inkscape:grid
        type="xygrid"
@@ -188,8 +188,8 @@
      inkscape:label="circle"
      style="display:inline">
     <path
-       style="fill:url(#linearGradient3710);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3720);stroke-width:1.03536737;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
-       d="m 2.677454,24.057114 c -2.26898106,6.669282 -1.1344905,3.33464 0,0 z"
+       style="fill:url(#linearGradient3710);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3720);stroke-width:1.03536737;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 2.3041207,24.057114 c -2.26898109,6.669282 -1.1344905,3.33464 0,0 z"
        id="path3695"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cc" />
@@ -201,19 +201,19 @@
      style="display:inline">
     <path
        style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       d="M 25.195659,4.8005208 17.988179,15.901503 27.933522,14.429532 25.195659,4.8005208 z"
+       d="M 24.822326,4.8005208 17.614846,15.901503 27.560189,14.429532 24.822326,4.8005208 Z"
        id="path3872"
        sodipodi:nodetypes="cccc"
        inkscape:connector-curvature="0" />
     <path
        id="path3823"
-       style="fill:url(#linearGradient3834);fill-opacity:1;stroke:#006b0c;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 22.768247,22.571097 C 19.629624,25.906125 14.27426,26.162584 10.806705,23.143915 9.245624,21.784921 8.3332925,19.993813 8.0883583,18.130799 7.7892322,15.855591 8.485499,13.473137 10.211125,11.639527 c 3.138623,-3.3350283 8.493987,-3.5914882 11.961541,-0.572818 0.03107,0.02705 -4.005361,4.779107 -3.974714,4.806588 L 30.742328,14.874869 30.259982,1.5122364 26.088554,6.3790129 C 20.041371,1.1146547 10.701973,1.5619031 5.2284239,7.3779704 -0.24512559,13.194037 0.21989559,22.17649 [...]
+       style="fill:url(#linearGradient3834);fill-opacity:1;stroke:#006b0c;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-linejoin:round"
+       d="M 22.394914,22.571097 C 19.256291,25.906125 13.900927,26.162584 10.433372,23.143915 8.8722907,21.784921 7.9599592,19.993813 7.715025,18.130799 7.4158989,15.855591 8.1121657,13.473137 9.8377917,11.639527 12.976415,8.3044987 18.331779,8.0480388 21.799333,11.066709 c 0.03107,0.02705 -4.005361,4.779107 -3.974714,4.806588 L 30.368995,14.874869 29.886649,1.5122364 25.715221,6.3790129 C 19.668038,1.1146547 10.32864,1.5619031 4.8550906,7.3779704 -0.61845892,13.194037 -0.15343774,22.176 [...]
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cssssccccssc" />
     <path
        style="fill:url(#linearGradient3858);fill-opacity:1;stroke:none"
-       d="M 15.293391,6.0370671 C 6.7760313,6.2860296 0.70418868,16.68213 7.7921142,24.620644 8.656243,25.449408 11.961076,27.578711 15.852084,27.289269 22.378473,26.861982 23.69003,23.964368 23.173979,23.85278 21.872487,23.571353 21.902663,25.717886 16.06003,26.061511 7.3423181,24.750823 3.8761879,15.237487 11.266923,10.004953 12.995436,8.9778917 14.613912,8.3291145 16.293549,8.2451512 18.270837,8.1463084 20.332886,8.8302016 22.758988,10.601138 22.341735,7.6886086 19.166305,6.392768 15. [...]
+       d="M 14.920058,6.0370671 C 6.402698,6.2860296 0.33085535,16.68213 7.4187809,24.620644 c 0.8641288,0.828764 4.1689621,2.958067 8.0599701,2.668625 6.526389,-0.427287 7.837946,-3.324901 7.321895,-3.436489 -1.301492,-0.281427 -1.271316,1.865106 -7.113949,2.208731 C 6.9689848,24.750823 3.5028546,15.237487 10.89359,10.004953 12.622103,8.9778917 14.240579,8.3291145 15.920216,8.2451512 17.897504,8.1463084 19.959553,8.8302016 22.385655,10.601138 21.968402,7.6886086 18.792972,6.392768 14.92 [...]
        id="path3844"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cccsccscc" />
diff --git a/Viewer/images/search.svg b/Viewer/images/search.svg
index 6a6ef4c..236bf61 100644
--- a/Viewer/images/search.svg
+++ b/Viewer/images/search.svg
@@ -14,7 +14,7 @@
    height="32"
    id="svg2458"
    sodipodi:version="0.32"
-   inkscape:version="0.48.4 r9939"
+   inkscape:version="0.91 r13725"
    inkscape:export-xdpi="90"
    inkscape:export-ydpi="90"
    sodipodi:docname="search.svg"
@@ -23,18 +23,6 @@
   <defs
      id="defs2460">
     <linearGradient
-       inkscape:collect="always"
-       id="linearGradient19264">
-      <stop
-         style="stop-color:#5e4c1e;stop-opacity:1"
-         offset="0"
-         id="stop19266" />
-      <stop
-         style="stop-color:#a07847;stop-opacity:0.98823529"
-         offset="1"
-         id="stop19268" />
-    </linearGradient>
-    <linearGradient
        id="linearGradient18283">
       <stop
          style="stop-color:#b3dff1;stop-opacity:1;"
@@ -54,16 +42,6 @@
        x2="17.659527"
        y2="10.240396"
        gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient19264"
-       id="linearGradient19270"
-       x1="17.714294"
-       y1="25.441625"
-       x2="27.404643"
-       y2="25.441625"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2318497,-0.05354068,0.05262685,1.2108246,-5.664973,-3.9557037)" />
   </defs>
   <sodipodi:namedview
      id="base"
@@ -73,16 +51,16 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="17.412504"
-     inkscape:cx="-7.828412"
+     inkscape:cx="6.598721"
      inkscape:cy="15.951598"
      inkscape:current-layer="layer1"
      showgrid="true"
      inkscape:grid-bbox="true"
      inkscape:document-units="px"
      inkscape:window-width="1920"
-     inkscape:window-height="1180"
-     inkscape:window-x="1916"
-     inkscape:window-y="-4"
+     inkscape:window-height="1144"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
      inkscape:window-maximized="1"
      inkscape:snap-grids="false"
      inkscape:snap-to-guides="false">
@@ -149,7 +127,7 @@
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="ccccc" />
     <path
-       style="fill:#e0b478;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient19270);stroke-width:1.13095403;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       style="fill:#6371a4;fill-opacity:1;fill-rule:evenodd;stroke:#3d4975;stroke-width:1.13095403;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
        d="m 18.090556,23.539926 1.466639,2.382869 2.799401,2.992204 3.285468,2.41503 3.231191,-2.753874 -1.744048,-3.538517 -2.594059,-3.167943 -2.059147,-1.967885 -4.385445,3.638116 z"
        id="path3413"
        inkscape:connector-curvature="0" />
diff --git a/Viewer/images/trigger_left_arrow.svg b/Viewer/images/trigger_left_arrow.svg
new file mode 100644
index 0000000..c50447b
--- /dev/null
+++ b/Viewer/images/trigger_left_arrow.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="trigger_left_arrow.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3601">
+      <stop
+         style="stop-color:#a2a2a2;stop-opacity:1;"
+         offset="0"
+         id="stop3603" />
+      <stop
+         style="stop-color:#9c6868;stop-opacity:0"
+         offset="1"
+         id="stop3605" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.46875"
+     inkscape:cx="17.418749"
+     inkscape:cy="16.225262"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer3"
+     showgrid="true"
+     inkscape:window-width="1580"
+     inkscape:window-height="1003"
+     inkscape:window-x="146"
+     inkscape:window-y="99"
+     inkscape:window-maximized="0"
+     inkscape:snap-to-guides="false"
+     inkscape:snap-grids="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2831"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <cc:license
+           rdf:resource="Apache License 2.0" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:creator>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>ECMWF</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:language>en-GB</dc:language>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>Metview icon</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:description>Metview icon</dc:description>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="arrow"
+     style="display:inline">
+    <path
+       style="fill:#5f6163;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 2.2677347,29.543433 4.7080489,-0.06465 -0.07546,-9.668477 c 0,0 -0.263386,-2.599828 1.176669,-3.845392 1.3360728,-1.155638 1.9857624,-1.264146 6.5204904,-1.309066 l 5.033158,-0.04986 -1.891663,5.975517 12.838755,-7.8773 -13.031139,-8.8254242 2.041492,6.1134257 c 0.18059,-2.65e-4 -5.190452,0.00511 -5.190452,0.00511 -5.0634596,0.1839895 -7.7876524,-0.010059 -10.2577816,2.7269895 -2.470129,2.737047 -1.9331048,6.247676 -1.9331048,6.247676 0.016863,3.033259 0.060987,10.571443 0.06 [...]
+       id="path4146"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccsscccccszcc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="bar" />
+</svg>
diff --git a/Viewer/images/trigger_right_arrow.svg b/Viewer/images/trigger_right_arrow.svg
new file mode 100644
index 0000000..f42e1fc
--- /dev/null
+++ b/Viewer/images/trigger_right_arrow.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="32"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="trigger_right_arrow.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3601">
+      <stop
+         style="stop-color:#a2a2a2;stop-opacity:1;"
+         offset="0"
+         id="stop3603" />
+      <stop
+         style="stop-color:#9c6868;stop-opacity:0"
+         offset="1"
+         id="stop3605" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.46875"
+     inkscape:cx="4.3027988"
+     inkscape:cy="16.225262"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer3"
+     showgrid="true"
+     inkscape:window-width="1580"
+     inkscape:window-height="1003"
+     inkscape:window-x="1986"
+     inkscape:window-y="90"
+     inkscape:window-maximized="0"
+     inkscape:snap-to-guides="false"
+     inkscape:snap-grids="false"
+     showguides="true"
+     inkscape:guide-bbox="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2831"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <cc:license
+           rdf:resource="Apache License 2.0" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title />
+          </cc:Agent>
+        </dc:creator>
+        <dc:publisher>
+          <cc:Agent>
+            <dc:title>ECMWF</dc:title>
+          </cc:Agent>
+        </dc:publisher>
+        <dc:language>en-GB</dc:language>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>Metview icon</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:description>Metview icon</dc:description>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="arrow"
+     style="display:inline">
+    <path
+       style="fill:#5f6163;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 3.0033147,6.3755319 -5e-7,4.7726941 14.6462528,0.05382 c 2.81105,0.206969 2.552462,2.40495 2.552462,2.40495 l 0.0013,6.511228 -6.169456,-3.119947 8.717705,12.321584 7.985018,-12.190736 -5.725544,3.075834 0.124186,-7.065198 c 0,0 0.340496,-2.422002 -1.369423,-4.4396001 C 22.055901,6.6825634 19.39294,6.4438358 19.39294,6.4438358 15.583923,6.3314056 3.0033147,6.3755319 3.0033147,6.3755319 Z"
+       id="path4146"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccccczcc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="bar" />
+</svg>
diff --git a/Viewer/src/AbstractNodeModel.cpp b/Viewer/src/AbstractNodeModel.cpp
index b7fca05..0febc7d 100644
--- a/Viewer/src/AbstractNodeModel.cpp
+++ b/Viewer/src/AbstractNodeModel.cpp
@@ -162,22 +162,12 @@ QModelIndex AbstractNodeModel::infoToIndex(VInfo_ptr info,int column) const
         else if(info->isNode())
         {
             VNode* n=info->node();
-            QModelIndex idx=nodeToIndex(n);
-            if(!idx.isValid())
-            {
-                return forceShowNode(n);
-            }
-            return idx;
+            return nodeToIndex(n);  
         }
         else if(info->isAttribute())
         {
             VAttribute* a=info->attribute();
-            QModelIndex idx=attributeToIndex(a);
-            if(!idx.isValid())
-            {
-                return forceShowAttribute(a);
-            }
-            return idx;
+            return attributeToIndex(a);     
         }
 	}
 
diff --git a/Viewer/src/AbstractNodeModel.hpp b/Viewer/src/AbstractNodeModel.hpp
index 3ccc492..dcaf80e 100644
--- a/Viewer/src/AbstractNodeModel.hpp
+++ b/Viewer/src/AbstractNodeModel.hpp
@@ -54,9 +54,6 @@ public:
 	virtual QModelIndex nodeToIndex(const VNode*,int column=0) const=0;
     virtual QModelIndex attributeToIndex(const VAttribute* a, int column=0) const=0;
 
-    virtual QModelIndex forceShowNode(const VNode*) const=0;
-    virtual QModelIndex forceShowAttribute(const VAttribute*) const=0;
-
 Q_SIGNALS:
 	void changed();
 	void filterChanged();
diff --git a/Viewer/src/AbstractNodeView.cpp b/Viewer/src/AbstractNodeView.cpp
new file mode 100644
index 0000000..3145b71
--- /dev/null
+++ b/Viewer/src/AbstractNodeView.cpp
@@ -0,0 +1,1264 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 "AbstractNodeView.hpp"
+
+#include "Animation.hpp"
+#include "ExpandState.hpp"
+#include "TreeNodeModel.hpp"
+#include "TreeNodeViewDelegate.hpp"
+#include "UIDebug.hpp"
+#include "UiLog.hpp"
+
+#include <QtAlgorithms>
+#include <QApplication>
+#include <QDebug>
+#include <QItemSelectionRange>
+#include <QPainter>
+#include <QMouseEvent>
+#include <QScrollBar>
+#include <QStack>
+#include <QStyledItemDelegate>
+#include <QTimerEvent>
+#include <QToolTip>
+
+//#define _UI_QABSTRACTNODEVIEW_DEBUG
+
+AbstractNodeView::AbstractNodeView(TreeNodeModel* model,QWidget* parent) :
+    QAbstractScrollArea(parent),
+    model_(model),
+    verticalScrollMode_(ScrollPerItem),
+    rowCount_(0),
+    maxRowWidth_(0),
+    topMargin_(4),
+    leftMargin_(4),
+    itemGap_(12),
+    connectorGap_(1),
+    expandConnectorLenght_(20),   
+    connectorColour_(Qt::black),
+    drawConnector_(true),
+    indentation_(0),
+    lastViewedItem_(0),
+    noSelectionOnMousePress_(false)
+{  
+    expandConnectorLenght_=itemGap_-2*connectorGap_;
+
+    setContextMenuPolicy(Qt::CustomContextMenu);
+
+    viewport()->setBackgroundRole(QPalette::Window);
+
+    //We attach the model.
+    attachModel();
+
+    //We should call reset here but it has a pure virtual method,
+    //so cannot be called from the constructor. We need to call it from
+    //the constructor of the derived classes
+
+    delegate_=new TreeNodeViewDelegate(model_,this);
+}
+
+AbstractNodeView::~AbstractNodeView()
+{
+
+}
+
+//Connect the models signal to the view. Must only be called once!!
+void AbstractNodeView::attachModel()
+{
+    //Standard signals from the model
+    connect(model_,SIGNAL(modelReset()),
+        this,SLOT(reset()));
+
+    connect(model_,SIGNAL(rowsInserted(QModelIndex,int,int)),
+              this, SLOT(rowsInserted(QModelIndex,int,int)));
+
+    connect(model_,SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
+            this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int)));
+
+    connect(model_,SIGNAL(rowsRemoved(QModelIndex,int,int)),
+            this, SLOT(rowsRemoved(QModelIndex,int,int)));
+
+    connect(model_,SIGNAL(dataChanged(const QModelIndex&,const QModelIndex&)),
+        this,SLOT(dataChanged(const QModelIndex&,const QModelIndex&)));
+
+    //The selection model
+    selectionModel_ = new QItemSelectionModel(model_, this);
+    connect(model_, SIGNAL(destroyed()), selectionModel_, SLOT(deleteLater()));
+
+    connect(selectionModel_, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+            this, SLOT(selectionChanged(QItemSelection,QItemSelection)));
+
+    //broadcast the selection change
+    connect(selectionModel_, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
+            this, SIGNAL(selectionChangedInView(QItemSelection,QItemSelection)));
+
+    connect(selectionModel_, SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+            this, SLOT(currentChanged(QModelIndex,QModelIndex)));
+
+}
+
+void AbstractNodeView::mousePressEvent(QMouseEvent* event)
+{
+    //When the expand indicator is pressed
+    if(event->button() == Qt::LeftButton)
+    {
+        int viewItemIndex=itemAtCoordinate(event->pos());
+        if(viewItemIndex != -1 && viewItems_[viewItemIndex].hasChildren)
+        {
+            if(isPointInExpandIndicator(viewItemIndex,event->pos()))
+            {
+                if(viewItems_[viewItemIndex].expanded)
+                {
+                    collapse(viewItemIndex);
+                    updateRowCount();
+                    updateScrollBars();
+                    viewport()->update();
+                }
+                else
+                {
+                    expand(viewItemIndex);
+                }
+                return;
+            }
+        }
+    }
+
+    //Middle button - expand only, no selection
+    else if(event->button() == Qt::MidButton)
+    {
+        int viewItemIndex=itemAtCoordinate(event->pos());
+        if(viewItemIndex != -1 && viewItems_[viewItemIndex].hasChildren)
+        {
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+            UiLog().dbg() << " midbutton index=" << viewItemIndex << " name=" <<
+                               viewItems_[viewItemIndex].index.data().toString();
+#endif
+            if(viewItems_[viewItemIndex].expanded)
+            {
+                collapse(viewItemIndex);
+                updateRowCount();
+                updateScrollBars();
+                viewport()->update();
+            }
+            else
+            {
+                expand(viewItemIndex);
+            }
+        }
+        return;
+    }
+
+    //No selection for context menu. Works on linux but can be platform dependent!!!
+    else if(event->button() == Qt::RightButton)
+    {
+        return;
+    }
+
+    QPoint pos = event->pos();
+    QPersistentModelIndex index = indexAt(pos);
+
+    pressedIndex_ = index;
+
+    //Get the selection flags
+    QItemSelectionModel::SelectionFlags command = selectionCommand(index, event);
+
+    noSelectionOnMousePress_ = command == QItemSelectionModel::NoUpdate || !index.isValid();
+
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+    UiLog().dbg() << "TreeNodeViewBase::mousePressEvent --> current=" << currentIndex().data().toString() <<
+                     " pressed=" << pressedIndex_.data().toString() <<
+                     " pos=" << pos << " pressedRef=" << pressedRefIndex_.data().toString();
+#endif
+
+    if((command & QItemSelectionModel::Current) == 0)
+        pressedRefIndex_ = index;
+    else if(!pressedRefIndex_.isValid())
+        pressedRefIndex_ = currentIndex();
+
+    QPoint pressedRefPosition=visualRect(pressedRefIndex_).center();
+
+
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+    UiLog().dbg() << " pressedRefPosition=" << pressedRefPosition << " visrect=" << visualRect(currentIndex()) <<
+                     " center=" << visualRect(currentIndex()).center() << " pressedRef=" << indexAt(pressedRefPosition).data().toString() <<
+                     " pressedRef=" << pressedRefIndex_.data().toString();
+#endif
+
+    if(index.isValid())
+    {
+        selectionModel_->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
+        QPoint p1=pressedRefPosition;
+        QRect rect(p1,QSize(pos.x()-p1.x(),pos.y()-p1.y()));
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+        UiLog().dbg() << " rect=" << rect << " p1=" << p1 << " p2=" << pos ;
+#endif
+        setSelection(rect, command);
+    }
+    else
+    {
+        //Forces a finalize even if mouse is pressed, but not on a item
+        selectionModel_->select(QModelIndex(), QItemSelectionModel::Select);
+    }
+}
+
+void AbstractNodeView::mouseReleaseEvent(QMouseEvent *event)
+{
+    QPoint pos = event->pos();
+    QPersistentModelIndex index = indexAt(pos);
+
+    if(selectionModel_ && noSelectionOnMousePress_)
+    {
+        noSelectionOnMousePress_ = false;
+        selectionModel_->select(index, selectionCommand(index, event));
+    }
+}
+
+void AbstractNodeView::mouseDoubleClickEvent(QMouseEvent *event)
+{
+    if(event->button() == Qt::LeftButton)
+    {
+        int viewItemIndex=itemAtCoordinate(event->pos());
+        if(viewItemIndex != -1)
+        {
+            if(viewItems_[viewItemIndex].hasChildren)
+            {
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+                UiLog().dbg() << "CompactNodeView::mousePressEvent " << viewItemIndex << " name=" <<
+                               viewItems_[viewItemIndex].index.data().toString();
+#endif
+                if(viewItems_[viewItemIndex].expanded)
+                {
+                    collapse(viewItemIndex);
+                }
+                else
+                {
+                    expand(viewItemIndex);
+                }
+                updateRowCount();
+                updateScrollBars();
+                viewport()->update();
+            }
+            else
+            {
+                Q_EMIT doubleClicked(viewItems_[viewItemIndex].index);
+            }
+       }
+    }
+}
+
+void AbstractNodeView::keyPressEvent(QKeyEvent *event)
+{
+    QModelIndex current = currentIndex();
+
+    if (current.isValid())
+    {
+        switch(event->key())
+        {
+        case Qt::Key_Plus:
+            expand(current);
+            break;
+        case Qt::Key_Minus:
+            collapse(current);
+            break;
+        }
+    }
+
+    QAbstractScrollArea::keyPressEvent(event);
+}
+
+bool AbstractNodeView::viewportEvent(QEvent *event)
+{
+    if(event->type() == QEvent::ToolTip)
+    {
+        QHelpEvent *he = static_cast<QHelpEvent*>(event);
+        const QModelIndex index = indexAt(he->pos());
+
+        //see qbatractitemdelegate::helpEvent()
+        QVariant tooltip = index.data(Qt::ToolTipRole);
+        if(tooltip.canConvert<QString>())
+        {
+              QToolTip::showText(he->globalPos(),tooltip.toString(),this);
+              return true;
+        }
+        return false;
+    }
+    return QAbstractScrollArea::viewportEvent(event);
+}
+
+void AbstractNodeView::timerEvent(QTimerEvent *event)
+{
+    if(event->timerId() == delayedWidth_.timerId())
+    {
+        updateScrollBars();
+        viewport()->update();
+        delayedWidth_.stop();
+    }
+}
+
+void AbstractNodeView::reset()
+{
+    viewItems_.clear();
+    rowCount_=0;
+    maxRowWidth_=0;
+    expandedIndexes.clear();
+    pressedRefIndex_=QPersistentModelIndex(QModelIndex());
+    //currentIndexSet_ = false;
+    if(selectionModel_)
+        selectionModel_->reset();
+
+    layout(-1,false,false,false);
+    updateRowCount();
+    updateScrollBars();
+}
+
+/*
+ Informs the view that the rows from the start row to the end row
+ inclusive have been inserted into the parent model item.
+*/
+void AbstractNodeView::rowsInserted(const QModelIndex& parent,int start,int end)
+{
+    const int parentItem = viewIndex(parent);
+
+    //If the item is expanded we need to relayout the whole tree
+    if(((parentItem != -1) && viewItems_[parentItem].expanded) || (parent == root_))
+    {
+        doItemsLayout();
+    }
+
+    //the parent just went from 0 children to more. update to re-paint the decoration
+    else if(parentItem != -1 && (model_->rowCount(parent) == end - start + 1))
+    {
+        viewItems_[parentItem].hasChildren = true;
+        viewport()->update();
+    }
+}
+
+/*
+  Informs the view that the rows from the start row to the  end row
+  inclusive are about to removed from the given parent model item.
+*/
+void AbstractNodeView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
+{
+    //TODO: the selection has to be adjusted!!!
+    //QAbstractItemView::rowsAboutToBeRemoved(parent, start, end);
+
+    //A safety measure
+    viewItems_.clear();
+}
+
+/*
+    Informs the view that the rows from the start row to the  end row
+    inclusive have been removed from the given  parent model item.
+*/
+void AbstractNodeView::rowsRemoved(const QModelIndex &parent, int start, int end)
+{
+    doItemsLayout(true);
+}
+
+void AbstractNodeView::doItemsLayout(bool hasRemovedItems)
+{
+    if(hasRemovedItems)
+    {
+        //clean the QSet that may contains old (and thus invalid) indexes
+        QSet<QPersistentModelIndex>::iterator it = expandedIndexes.begin();
+        while (it != expandedIndexes.constEnd())
+        {
+            if (!it->isValid())
+                it = expandedIndexes.erase(it);
+            else
+                ++it;
+        }
+        //TODO: do we need to clear the selectionmodel?
+    }
+
+    viewItems_.clear(); // prepare for new layout
+    rowCount_=0;
+    maxRowWidth_=0;
+    pressedRefIndex_=QPersistentModelIndex(QModelIndex());
+
+    QModelIndex parent = root_;
+    if(model_->hasChildren(parent))
+    {
+        layout(-1,false,false,false);
+    }
+    updateRowCount();
+    updateScrollBars();
+    viewport()->update();
+}
+
+
+void AbstractNodeView::paintEvent(QPaintEvent *event)
+{
+    QPainter painter(viewport());
+    paint(&painter,event->region());
+}
+
+void AbstractNodeView::slotRepaint(Animation* an)
+{
+    if(!an)
+        return;
+
+    Q_FOREACH(VNode* n,an->targets())
+    {
+        update(model_->nodeToIndex(n));
+    }
+}
+
+//Updates the area occupied by the given index.
+void AbstractNodeView::update(const QModelIndex &index)
+{
+    if (index.isValid())
+    {
+        const QRect rect = visualRect(index);
+        //this test is important for peformance reasons
+        //For example in dataChanged if we simply update all the cells without checking
+        //it can be a major bottleneck to update rects that aren't even part of the viewport
+        if(viewport()->rect().intersects(rect))
+        {
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+            UiLog().dbg() << "update -->" << index.data().toString() << " rect=" << rect;
+#endif
+            updateViewport(rect);
+        }
+    }
+}
+
+/*
+    This slot is called when items are changed in the model. The
+    changed items are those from topLeft to bottomRight
+    inclusive. If just one item is changed topLeft ==
+    bottomRight.
+*/
+void AbstractNodeView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
+{
+    // Single item changed
+    if (topLeft == bottomRight && topLeft.isValid())
+    {
+        update(topLeft);
+        return;
+    }
+
+    viewport()->update();
+}
+
+void AbstractNodeView::resizeEvent(QResizeEvent *event)
+{
+    QAbstractScrollArea::resizeEvent(event);
+    updateScrollBars();
+    viewport()->update();
+}
+
+void AbstractNodeView::doDelayedWidthAdjustment()
+{
+    if(!delayedWidth_.isActive())
+    {
+        delayedWidth_.start(0,this);
+    }
+}
+
+int AbstractNodeView::translation() const
+{
+    return horizontalScrollBar()->value();
+}
+
+void AbstractNodeView::scrollTo(const QModelIndex &index)
+{
+    if(!index.isValid())
+        return;
+
+    //d->executePostedLayout();
+    updateScrollBars();
+
+    // Expand all parents if the parent(s) of the node are not expanded.
+    QList<QModelIndex> parentLst;
+    QModelIndex parent = index.parent();
+    while(parent.isValid())
+    {
+        parentLst.prepend(parent);
+        parent = model_->parent(parent);
+    }
+
+    Q_FOREACH(QModelIndex pt,parentLst)
+    {
+        if(!isExpanded(pt))
+            expand(pt);
+    }
+
+    int item = viewIndex(index);
+    if (item < 0)
+        return;
+
+    if (verticalScrollMode_ == ScrollPerItem)
+    {
+        int row=itemRow(item);
+
+        int top = verticalScrollBar()->value();
+        int bottom = top + verticalScrollBar()->pageStep();
+
+        if (row >= top && row < bottom)
+        {
+            // nothing to do
+        }
+        else if(row < top)
+        {
+            verticalScrollBar()->setValue(row);
+        }
+        else
+        {
+            verticalScrollBar()->setValue(row);
+#if 0
+            const int currentItemHeight = viewItem_[item].height;
+            int y = area.height();
+            if (y > currentItemHeight)
+            {
+                while (item >= 0)
+                {
+                    y -= viewItem_[item].height;
+                    if (y < 0)
+                    { //there is no more space left
+                        item++;
+                        break;
+                    }
+                    item--;
+                }
+            }
+            verticalScrollBar()->setValue(item);
+#endif
+        }
+    }
+    else // ScrollPerPixel
+    {
+
+    }
+
+    // horizontal
+    int viewportWidth = viewport()->width();
+    int xp=viewItems_[item].x;
+    int horizontalPosition=xp-horizontalScrollBar()->value();
+
+    if( horizontalPosition< 0)
+    {
+        xp-=10;
+        if(xp < 0) xp=0;
+        horizontalScrollBar()->setValue(xp);
+    }
+    else if(horizontalPosition > viewportWidth)
+    {
+        xp-=10;
+        horizontalScrollBar()->setValue(xp);
+    }
+}
+
+
+//point is in viewport coordinates
+QModelIndex AbstractNodeView::indexAt(const QPoint &point) const
+{
+    int item=itemAtCoordinate(point);
+    return (item>=0)?viewItems_[item].index:QModelIndex();
+}
+
+QModelIndex AbstractNodeView::modelIndex(int i) const
+{
+    if(i < 0 || i >= static_cast<int>(viewItems_.size()))
+        return QModelIndex();
+
+    return viewItems_[i].index;
+}
+
+//Returns the index of the view item representing the given index
+int AbstractNodeView::viewIndex(const QModelIndex& index) const
+{
+    if(!index.isValid() || viewItems_.empty())
+        return -1;
+
+    const int totalCount = static_cast<int>(viewItems_.size());
+    const QModelIndex topIndex = index.sibling(index.row(), 0);
+    const int row = topIndex.row();
+    const quintptr internalId = topIndex.internalId();
+
+    // We start nearest to the lastViewedItem
+    int localCount = qMin(lastViewedItem_ - 1, totalCount - lastViewedItem_);
+    for(int i = 0; i < localCount; ++i)
+    {
+        const QModelIndex &idx1 = viewItems_[lastViewedItem_ + i].index;
+        if(idx1.row() == row && idx1.internalId() == internalId)
+        {
+            lastViewedItem_ = lastViewedItem_ + i;
+            return lastViewedItem_;
+        }
+        const QModelIndex &idx2 = viewItems_[lastViewedItem_ - i - 1].index;
+        if(idx2.row() == row && idx2.internalId() == internalId)
+        {
+            lastViewedItem_ = lastViewedItem_ - i - 1;
+            return lastViewedItem_;
+        }
+    }
+
+    for(int j = qMax(0, lastViewedItem_ + localCount); j < totalCount; ++j)
+    {
+        const QModelIndex &idx = viewItems_[j].index;
+        if (idx.row() == row && idx.internalId() == internalId)
+        {
+            lastViewedItem_ = j;
+            return j;
+        }
+    }
+    for(int j = qMin(totalCount, lastViewedItem_ - localCount) - 1; j >= 0; --j)
+    {
+        const QModelIndex &idx = viewItems_[j].index;
+        if (idx.row() == row && idx.internalId() == internalId)
+        {
+            lastViewedItem_ = j;
+            return j;
+        }
+    }
+
+    // nothing found
+    return -1;
+}
+
+void AbstractNodeView::insertViewItems(int pos, int count, const TreeNodeViewItem &viewItem)
+{
+    ViewItemIterator it=viewItems_.begin();
+    viewItems_.insert(it+pos,count,viewItem);
+
+    //We need to update the parentItem in the items after the insertion
+    const int itemsCount=static_cast<int>(viewItems_.size());
+    for(int i = pos + count; i < itemsCount; i++)
+        if (viewItems_[i].parentItem >= pos)
+            viewItems_[i].parentItem += count;
+}
+
+
+void AbstractNodeView::removeViewItems(int pos, int count)
+{
+    ViewItemIterator it=viewItems_.begin();
+    viewItems_.erase(it+pos,it+pos+count);
+
+    //We need to update the parentItem in the items after the deletion
+    const int itemsCount=static_cast<int>(viewItems_.size());
+    for(int i=0; i < itemsCount; i++)
+        if(viewItems_[i].parentItem >= pos)
+           viewItems_[i].parentItem -= count;
+}
+
+
+//---------------------------------------
+// Expand / collapse
+//---------------------------------------
+
+void AbstractNodeView::totalNumOfChildren(const QModelIndex& idx,int& num) const
+{
+    int count=model_->rowCount(idx);
+    num+=count;
+    for(int i=0; i < count; i++)
+    {
+        QModelIndex chIdx=model_->index(i,0,idx);
+        totalNumOfChildren(chIdx,num);
+    }
+}
+
+void AbstractNodeView::totalNumOfExpandedChildren(const QModelIndex& idx,int& num) const
+{
+    int count=model_->rowCount(idx);
+    num+=count;
+    for(int i=0; i < count; i++)
+    {
+        QModelIndex chIdx=model_->index(i,0,idx);
+        if(isIndexExpanded(chIdx))
+        {
+            totalNumOfExpandedChildren(chIdx,num);
+        }
+    }
+}
+
+void AbstractNodeView::expand(int item)
+{
+    if(item != -1 && !viewItems_[item].expanded)
+    {
+        QModelIndex idx=viewItems_[item].index;
+
+        //mark the item as expanded
+        storeExpanded(idx);
+        viewItems_[item].expanded = true;
+
+        //The total number items to be inserted
+        int total=0;
+        totalNumOfExpandedChildren(idx,total);
+
+        //Insert the required number items
+        ViewItemIterator it=viewItems_.begin();
+        viewItems_.insert(it+item+1,total,TreeNodeViewItem());
+
+        //recursively relayout the item
+        layout(item,false,false,true);
+
+        UI_ASSERT(static_cast<int>(viewItems_[item].total)==total,"viewItems_[" << item << "].total=" << viewItems_[item].total <<
+                  " total=" << total);
+
+        //We need to update the parentItem in the items after the insertion.
+        //When layout() is called with the given arguments it is delayed to
+        //this point to gain performance!
+        const int itemsCount=static_cast<int>(viewItems_.size());
+        int count=viewItems_[item].total;
+        for(int i = item + count+1; i < itemsCount; i++)
+            if (viewItems_[i].parentItem >= item)
+                viewItems_[i].parentItem += count;
+
+        //update the scrollbars and rerender the viewport
+        updateRowCount();
+        updateScrollBars();
+        viewport()->update();
+    }
+}
+
+void AbstractNodeView::expand(const QModelIndex &idx)
+{
+    int item=viewIndex(idx);
+    expand(item);
+}
+
+void AbstractNodeView::expandAll(const QModelIndex& idx)
+{
+    int item = viewIndex(idx);
+    if (item != -1) // is visible
+    {
+        //first we need to collapse all the children to start
+        //with a managable state.
+        collapseAllCore(idx);
+
+        //mark the item as expanded
+        storeExpanded(idx);
+        viewItems_[item].expanded = true;
+
+        //The total number items to be inserted
+        int total=0;
+        totalNumOfChildren(idx,total);
+
+        //Insert the required number items
+        ViewItemIterator it=viewItems_.begin();
+        viewItems_.insert(it+item+1,total,TreeNodeViewItem());
+
+        //recursively relayout the item
+        layout(item,true,false,true);
+
+        UI_ASSERT(static_cast<int>(viewItems_[item].total)==total,"viewItems_[" << item << "].total=" << viewItems_[item].total <<
+                  " total=" << total);
+
+        //We need to update the parentItem in the items after the insertion.
+        //When layout() is called with the given arguments it is delayed to
+        //this point to gain performance!
+        const int itemsCount=static_cast<int>(viewItems_.size());
+        int count=viewItems_[item].total;
+        for(int i = item + count+1; i < itemsCount; i++)
+            if (viewItems_[i].parentItem >= item)
+                viewItems_[i].parentItem += count;
+
+
+        //update the scrollbars and rerender the viewport
+        updateRowCount();
+        updateScrollBars();
+        viewport()->update();
+    }
+}
+
+void AbstractNodeView::restoreExpand(const QModelIndex& idx)
+{
+    //expandedIndexed now contains all the indexes to expand
+    expand(idx);
+}
+
+void AbstractNodeView::collapse(int item)
+{
+    if (item == -1 || expandedIndexes.isEmpty())
+        return;
+
+    const QModelIndex &modelIndex = viewItems_.at(item).index;
+    //if(!isPersistent(modelIndex))
+    //       return; // if the index is not persistent, no chances it is expanded
+
+    QSet<QPersistentModelIndex>::iterator it = expandedIndexes.find(modelIndex);
+    if (it == expandedIndexes.end() || viewItems_.at(item).expanded == false)
+           return; // nothing to do
+
+    expandedIndexes.erase(it);
+    viewItems_[item].expanded = false;
+    int total=viewItems_[item].total;
+    int index = item;
+    while (index > -1)
+    {
+        viewItems_[index].total-=total;
+        index = viewItems_[index].parentItem;
+    }
+    removeViewItems(item + 1, total); // collapse
+}
+
+void AbstractNodeView::collapse(const QModelIndex &index)
+{
+    int i = viewIndex(index);
+    if (i != -1) // is visible
+    {
+        collapse(i);
+        updateRowCount();
+        updateScrollBars();
+        viewport()->update();
+    }
+}
+
+bool AbstractNodeView::collapseAllCore(const QModelIndex &index)
+{
+    //identify item
+    int item = viewIndex(index);
+
+    //check if there is nothing to do
+    if (item == -1 || expandedIndexes.isEmpty())
+        return false;
+
+    //check if the item is expanded
+    QSet<QPersistentModelIndex>::iterator it = expandedIndexes.find(index);
+    if (it == expandedIndexes.end() || viewItems_.at(item).expanded == false)
+           return false;
+
+    //remove all the children of the item
+    viewItems_[item].expanded = false;
+    int total=viewItems_[item].total;
+    int parentItem = item;
+    while (parentItem > -1)
+    {
+        viewItems_[parentItem].total-=total;
+        parentItem = viewItems_[parentItem].parentItem;
+    }
+    removeViewItems(item + 1, total);
+
+    //recursivel remove the indexes related to the deleted items from the expanded set
+    removeAllFromExpanded(index);
+
+    updateRowCount();
+    return true;
+}
+
+void AbstractNodeView::collapseAll(const QModelIndex &index)
+{
+    if(collapseAllCore(index))
+    {
+        updateScrollBars();
+        viewport()->update();
+    }
+}
+
+void AbstractNodeView::removeAllFromExpanded(const QModelIndex &index)
+{
+    if(expandedIndexes.isEmpty())
+        return;
+
+    QSet<QPersistentModelIndex>::iterator it = expandedIndexes.find(index);
+    if(it == expandedIndexes.end())
+       return;
+
+    expandedIndexes.erase(it);
+
+    for(int i=0; i < model_->rowCount(index); i++)
+    {
+        QModelIndex chIdx=model_->index(i, 0, index);
+        removeAllFromExpanded(chIdx);
+    }
+}
+
+
+bool AbstractNodeView::isExpanded(const QModelIndex &index) const
+{
+    return isIndexExpanded(index);
+}
+
+void AbstractNodeView::setExpanded(const QModelIndex &index, bool expanded)
+{
+    if (expanded)
+        expand(index);
+    else
+        collapse(index);
+}
+
+//Expands all expandable items.
+void AbstractNodeView::expandAll()
+{
+    viewItems_.clear();
+    expandedIndexes.clear();
+    //d->interruptDelayedItemsLayout();
+    layout(-1, true,false,false);
+    updateRowCount();
+    updateScrollBars();
+    viewport()->update();
+}
+
+//Collapses all expanded items.
+void AbstractNodeView::collapseAll()
+{
+    expandedIndexes.clear();
+    doItemsLayout();
+}
+
+//========================================================
+//
+// Selection
+//
+//========================================================
+
+void AbstractNodeView::setCurrentIndex(const QModelIndex &index)
+{
+    if(selectionModel_ && index.isValid())
+    {
+        QItemSelectionModel::SelectionFlags command = selectionCommand(index, 0);
+        selectionModel_->setCurrentIndex(index, command);
+        //currentIndexSet_ = true;
+        QPoint offset;
+        if((command & QItemSelectionModel::Current) == 0)
+            //pressedPosition_ = visualRect(currentIndex()).center() + offset;
+            pressedRefIndex_=currentIndex();
+    }
+}
+
+
+QModelIndex AbstractNodeView::currentIndex() const
+{
+    return selectionModel_ ? selectionModel_->currentIndex() : QModelIndex();
+}
+
+QModelIndexList AbstractNodeView::selectedIndexes() const
+{
+    if(selectionModel_)
+        return selectionModel_->selectedIndexes();
+
+    return QModelIndexList();
+}
+
+
+/*
+  Applies the selection command to the items in or touched by the
+  rectangle rect.
+*/
+void AbstractNodeView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command)
+{
+    if (!selectionModel_ || rect.isNull())
+        return;
+
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+    UiLog().dbg() << "TreeNodeViewBase::setSelection --> rect=" << rect;
+#endif
+
+    QPoint tl=QPoint(rect.x(),rect.y());
+    QPoint br=QPoint(rect.x()+rect.width(),rect.y()+rect.height());
+
+    if(tl.y() > br.y())
+        qSwap(tl,br);
+
+    QModelIndex topLeft = indexAt(tl);
+    QModelIndex bottomRight = indexAt(br);
+
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+    UiLog().dbg() << " tl=" << tl  << " " << topLeft.data().toString() <<
+                     " br=" << br  << " " << bottomRight.data().toString();
+#endif
+
+    if (!topLeft.isValid() && !bottomRight.isValid())
+    {
+        if(command & QItemSelectionModel::Clear)
+            selectionModel_->clear();
+        return;
+    }
+
+    if (!topLeft.isValid() && !viewItems_.empty())
+        topLeft = viewItems_.front().index;
+
+    if (!bottomRight.isValid() && !viewItems_.empty())
+    {
+        const QModelIndex index = viewItems_.back().index;
+        bottomRight = index.sibling(index.row(),0);
+    }
+
+    select(topLeft, bottomRight, command);
+}
+
+void AbstractNodeView::select(const QModelIndex &topIndex, const QModelIndex &bottomIndex,
+                              QItemSelectionModel::SelectionFlags command)
+{
+    QItemSelection selection;
+    const int top = viewIndex(topIndex),
+    bottom = viewIndex(bottomIndex);
+
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+    UiLog().dbg() << "TreeNodeViewBase::select --> command="  << command;
+    UiLog().dbg() << "top=" << top << " " << topIndex.data().toString() <<
+                     " bottom=" << bottom << " " << bottomIndex.data().toString();
+#endif
+
+    QModelIndex previous;
+    QItemSelectionRange currentRange;
+    QStack<QItemSelectionRange> rangeStack;
+    for(int i = top; i <= bottom; ++i)
+    {
+        QModelIndex index = modelIndex(i);
+        QModelIndex parent = index.parent();
+        QModelIndex previousParent = previous.parent();
+
+        //same parent as previous
+        if (previous.isValid() && parent == previousParent)
+        {
+            //same parent
+            if (qAbs(previous.row() - index.row()) > 1)
+            {
+                //a hole (hidden index inside a range) has been detected
+                if (currentRange.isValid())
+                {
+                    selection.append(currentRange);
+                }
+                //let's start a new range
+                currentRange = QItemSelectionRange(index, index);
+            }
+
+            else
+            {
+                QModelIndex tl = model_->index(currentRange.top(),0,
+                        currentRange.parent());
+                currentRange = QItemSelectionRange(tl, index);
+            }
+        }
+
+        //The current parent is the previous item
+        else if(previous.isValid() &&
+                parent == model_->index(previous.row(), 0, previousParent))
+        {
+            rangeStack.push(currentRange);
+            currentRange = QItemSelectionRange(index, index);
+        }
+
+        else
+        {
+            if(currentRange.isValid())
+                selection.append(currentRange);
+            if(rangeStack.isEmpty())
+            {
+                currentRange = QItemSelectionRange(index, index);
+            }
+            else
+            {
+                currentRange = rangeStack.pop();
+                index = currentRange.bottomRight(); //let's resume the range
+                --i; //we process again the current item
+            }
+        }
+
+        previous = index;
+    }
+
+    if (currentRange.isValid())
+        selection.append(currentRange);
+
+    for (int i = 0; i < rangeStack.count(); ++i)
+        selection.append(rangeStack.at(i));
+
+    selectionModel_->select(selection, command);
+}
+
+
+/*
+    Returns the SelectionFlags to be used when updating a selection with
+    to include the index specified. The  event is a user input event,
+    such as a mouse or keyboard event.
+*/
+
+QItemSelectionModel::SelectionFlags AbstractNodeView::selectionCommand(
+    const QModelIndex &index, const QEvent *event) const
+{
+    Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers();
+    if (event) {
+
+        switch (event->type()) {
+        case QEvent::MouseMove: {
+            // Toggle on MouseMove
+            modifiers = static_cast<const QMouseEvent*>(event)->modifiers();
+            if (modifiers & Qt::ControlModifier)
+                return QItemSelectionModel::ToggleCurrent|selectionBehaviorFlags();
+            break;
+        }
+        case QEvent::MouseButtonPress: {
+            modifiers = static_cast<const QMouseEvent*>(event)->modifiers();
+            const Qt::MouseButton button = static_cast<const QMouseEvent*>(event)->button();
+            const bool rightButtonPressed = button & Qt::RightButton;
+            const bool shiftKeyPressed = modifiers & Qt::ShiftModifier;
+            const bool controlKeyPressed = modifiers & Qt::ControlModifier;
+            const bool indexIsSelected = selectionModel_->isSelected(index);
+            if ((shiftKeyPressed || controlKeyPressed) && rightButtonPressed)
+                return QItemSelectionModel::NoUpdate;
+            if (!shiftKeyPressed && !controlKeyPressed && indexIsSelected)
+                return QItemSelectionModel::NoUpdate;
+            if (!index.isValid() && !rightButtonPressed && !shiftKeyPressed && !controlKeyPressed)
+                return QItemSelectionModel::Clear;
+            if (!index.isValid())
+                return QItemSelectionModel::NoUpdate;
+            break;
+        }
+        case QEvent::MouseButtonRelease: {
+            // ClearAndSelect on MouseButtonRelease if MouseButtonPress on selected item or empty area
+            modifiers = static_cast<const QMouseEvent*>(event)->modifiers();
+            const Qt::MouseButton button = static_cast<const QMouseEvent*>(event)->button();
+            const bool rightButtonPressed = button & Qt::RightButton;
+            const bool shiftKeyPressed = modifiers & Qt::ShiftModifier;
+            const bool controlKeyPressed = modifiers & Qt::ControlModifier;
+            if (((index == pressedIndex_ && selectionModel_->isSelected(index))
+                || !index.isValid()) //&& state != QAbstractItemView::DragSelectingState
+                && !shiftKeyPressed && !controlKeyPressed && (!rightButtonPressed || !index.isValid()))
+                return QItemSelectionModel::ClearAndSelect|selectionBehaviorFlags();
+            return QItemSelectionModel::NoUpdate;
+        }
+        case QEvent::KeyPress: {
+            // NoUpdate on Key movement and Ctrl
+            modifiers = static_cast<const QKeyEvent*>(event)->modifiers();
+            switch (static_cast<const QKeyEvent*>(event)->key()) {
+            case Qt::Key_Backtab:
+                modifiers = modifiers & ~Qt::ShiftModifier; // special case for backtab
+            case Qt::Key_Down:
+            case Qt::Key_Up:
+            case Qt::Key_Left:
+            case Qt::Key_Right:
+            case Qt::Key_Home:
+            case Qt::Key_End:
+            case Qt::Key_PageUp:
+            case Qt::Key_PageDown:
+            case Qt::Key_Tab:
+                if (modifiers & Qt::ControlModifier
+#ifdef QT_KEYPAD_NAVIGATION
+                    // Preserve historical tab order navigation behavior
+                    || QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
+#endif
+                    )
+                    return QItemSelectionModel::NoUpdate;
+                break;
+            case Qt::Key_Select:
+                return QItemSelectionModel::Toggle|selectionBehaviorFlags();
+            case Qt::Key_Space:// Toggle on Ctrl-Qt::Key_Space, Select on Space
+                if (modifiers & Qt::ControlModifier)
+                    return QItemSelectionModel::Toggle|selectionBehaviorFlags();
+                return QItemSelectionModel::Select|selectionBehaviorFlags();
+            default:
+                break;
+            }
+        }
+        default:
+            break;
+        }
+    }
+
+    if (modifiers & Qt::ShiftModifier)
+        return QItemSelectionModel::SelectCurrent|selectionBehaviorFlags();
+    if (modifiers & Qt::ControlModifier)
+        return QItemSelectionModel::Toggle|selectionBehaviorFlags();
+    //if (state == QAbstractItemView::DragSelectingState) {
+    //    //when drag-selecting we need to clear any previous selection and select the current one
+    //    return QItemSelectionModel::Clear|QItemSelectionModel::SelectCurrent|selectionBehaviorFlags();
+    //}
+
+    return QItemSelectionModel::ClearAndSelect|selectionBehaviorFlags();
+}
+
+/*
+  Returns the rectangle from the viewport of the items in the given
+  selection.
+
+  The returned region only contains rectangles intersecting
+  (or included in) the viewport.
+*/
+QRegion AbstractNodeView::visualRegionForSelection(const QItemSelection &selection) const
+{
+    if(selection.isEmpty())
+        return QRegion();
+
+    QRegion selectionRegion;
+    const QRect &viewportRect = viewport()->rect();
+    for(int i = 0; i < selection.count(); ++i)
+    {
+        QItemSelectionRange range = selection.at(i);
+        if (!range.isValid())
+            continue;
+
+        QModelIndex leftIndex = range.topLeft();
+        if (!leftIndex.isValid())
+            continue;
+
+        QModelIndex rightIndex = range.bottomRight();
+        if (!rightIndex.isValid())
+            continue;
+
+        int left=100000000,right=0,top=1000000000, bottom=0;
+        Q_FOREACH(QModelIndex idx,range.indexes())
+        {
+            const QRect r = visualRect(idx);
+            //UiLog().dbg() << r << " " << idx << " " << idx.data().toString();
+            if(r.x() < left) left=r.x();
+            if(r.right()+1 > right) right=r.right()+1;
+            if(r.y() < top) top=r.y();
+            if(r.bottom()+1 > bottom ) bottom=r.bottom()+1;
+        }
+
+        top-=1;
+        bottom+=1;
+
+        QRect combined(left,top,right-left+1,bottom-top+1);
+        if (viewportRect.intersects(combined))
+                selectionRegion += combined;
+    }
+    return selectionRegion;
+}
+
+/*
+    This slot is called when the selection is changed. The previous
+    selection (which may be empty), is specified by  deselected, and the
+    new selection by selected.
+*/
+void AbstractNodeView::selectionChanged(const QItemSelection &selected,
+                                   const QItemSelection &deselected)
+{
+    if(isVisible()) // && updatesEnabled()) {
+    {
+        QRegion des=visualRegionForSelection(deselected);
+        QRegion sel=visualRegionForSelection(selected);
+
+#ifdef _UI_QABSTRACTNODEVIEW_DEBUG
+        UiLog().dbg() << "TreeNodeViewBase::selectionChanged -->";
+        UiLog().dbg() << "  deselect=" << des.boundingRect() << " select=" << sel.boundingRect();
+        QRegion un=des | sel;
+        UiLog().dbg() << "  union=" << un.boundingRect();
+#endif
+        viewport()->update(des | sel);
+    }
+}
+
+/*
+    This slot is called when a new item becomes the current item.
+    The previous current item is specified by the previous index, and the new
+    item by the current index.
+*/
+void AbstractNodeView::currentChanged(const QModelIndex &current, const QModelIndex &previous)
+{
+    if(!isVisible())
+        return;
+
+    if(previous.isValid())
+    {
+        update(previous);
+    }
+
+    if(current.isValid())
+    {
+        scrollTo(current);
+        update(current);
+    }
+}
+
+
diff --git a/Viewer/src/CompactView.hpp b/Viewer/src/AbstractNodeView.hpp
similarity index 67%
copy from Viewer/src/CompactView.hpp
copy to Viewer/src/AbstractNodeView.hpp
index e9f67b1..a51e288 100644
--- a/Viewer/src/CompactView.hpp
+++ b/Viewer/src/AbstractNodeView.hpp
@@ -8,8 +8,8 @@
 //
 //============================================================================
 
-#ifndef COMPACTVIEW_HPP
-#define COMPACTVIEW_HPP
+#ifndef ABSTRACTNODEVIEW_HPP
+#define ABSTRACTNODEVIEW_HPP
 
 #include <QAbstractScrollArea>
 #include <QBasicTimer>
@@ -20,31 +20,30 @@
 #include <QSet>
 #include <QStyleOptionViewItem>
 
+class Animation;
 class TreeNodeModel;
-class GraphNodeViewItem;
-class CompactNodeViewDelegate;
-class QStyledItemDelegate;
+class TreeNodeViewDelegate;
 
 //Struct representing visible items in the view. When an item is collapsed
 //all its children will be removed from viewItems.
-struct CompactViewItem
+struct TreeNodeViewItem
 {
-    CompactViewItem() : parentItem(-1), total(0), widestInSiblings(0), expanded(0), hasChildren(0),
+    TreeNodeViewItem() : parentItem(-1), total(0), widestInSiblings(0), expanded(0), hasChildren(0),
                       hasMoreSiblings(0), level(0), width(0), height(0), x(0) {}
 
     QModelIndex index; //the model index represented by the item.
                        //We remove items whenever the indexes are invalidated
     int parentItem; // parent item index in viewItems
-    uint total; // total number of visible children in the view
-    uint widestInSiblings;
-    uint expanded : 1; //the item expanded
-    uint hasChildren : 1; // if the item has children in the model (it is
+    unsigned int total; // total number of visible children in the view
+    unsigned int widestInSiblings;
+    unsigned int expanded : 1; //the item expanded
+    unsigned int hasChildren : 1; // if the item has children in the model (it is
                           // independent of the expanded/collapsed state)
-    uint hasMoreSiblings : 1;
-    uint level : 12; // indentation
-    uint width: 12;
-    uint height : 16;
-    uint x: 16;
+    unsigned int hasMoreSiblings : 1;
+    unsigned int level : 12; // indentation
+    unsigned int width: 12;
+    unsigned int height : 16;
+    unsigned int x: 16;
 
     int right() const {return x+width;}
     int alignedRight() const {return x+widestInSiblings;}
@@ -53,22 +52,25 @@ struct CompactViewItem
 };
 
 
-class CompactView : public QAbstractScrollArea
+class AbstractNodeView : public QAbstractScrollArea
 {
 Q_OBJECT
 
+    friend class TreeNodeView;
+
 public:
-    explicit CompactView(TreeNodeModel* model,QWidget *parent=0);
-    ~CompactView();
+    explicit AbstractNodeView(TreeNodeModel* model,QWidget *parent=0);
+    virtual ~AbstractNodeView();
 
     QModelIndex currentIndex() const;
     QModelIndexList selectedIndexes() const;
     QModelIndex indexAt(const QPoint &point) const;
-    QRect visualRect(const QModelIndex &index) const;
+    virtual QRect visualRect(const QModelIndex &index) const=0;
     bool isExpanded(const QModelIndex &index) const;
     void setExpanded(const QModelIndex &index, bool expanded);
     void expandAll(const QModelIndex &index);
     void collapseAll(const QModelIndex &index);
+    TreeNodeViewDelegate* delegate() const {return delegate_;}
 
 public Q_SLOTS:
     void reset();
@@ -78,17 +80,19 @@ public Q_SLOTS:
     void collapse(const QModelIndex &index);
     void expandAll();
     void collapseAll();
+    void slotRepaint(Animation*);
 
 protected Q_SLOTS:
     void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
     void rowsInserted(const QModelIndex&,int,int);
     void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
     void rowsRemoved(const QModelIndex &parent, int start, int end);
-    virtual void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+    void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
     void currentChanged(const QModelIndex &current, const QModelIndex &previous);
 
 Q_SIGNALS:
     void doubleClicked(const QModelIndex&);
+    void selectionChangedInView(const QItemSelection &selected, const QItemSelection &deselected);
 
 protected:
     void mousePressEvent(QMouseEvent* event);
@@ -102,27 +106,35 @@ protected:
 
     void attachModel();
     void insertItems(const QModelIndex& parent, int);
-    void paint(QPainter *painter,const QRegion& region);
-    void drawRow(QPainter* painter,int start,int xOffset,int &yp,int &itemsInRow,std::vector<int>&);
 
+    virtual void paint(QPainter *painter,const QRegion& region)=0;
+
+    //layout
+    void doDelayedWidthAdjustment();
     void doItemsLayout(bool hasRemovedItems=false);
-    void layout(int parentId, bool recursiveExpanding,bool afterIsUninitialized,bool preAllocated);
+    virtual void layout(int parentId, bool recursiveExpanding,bool afterIsUninitialized,bool preAllocated)=0;
 
+    //Item lookup
     void scrollTo(const QModelIndex &index);
-    int itemRow(int item) const;
-    int itemCountInRow(int start) const;
-    void rowProperties(int start,int& rowHeight,int &itemsInRow,std::vector<int>& indentVec) const;
-    int rowHeight(int start,int forward,int &itemsInRow) const;   
-    void coordinateForItem(int item,int& itemY,int& itemRowHeight) const;
-    int itemAtCoordinate(const QPoint& coordinate) const;
-    int itemAtRowCoordinate(int start,int count,int xPos) const;
-
+    virtual int itemRow(int item) const=0;
+    virtual int itemAtCoordinate(const QPoint& coordinate) const=0;    
     QModelIndex modelIndex(int i) const;
     int viewIndex(const QModelIndex& index) const;
+    virtual bool isPointInExpandIndicator(int,QPoint) const=0;
 
+    //Expand collapse
     void restoreExpand(const QModelIndex& idx);
     void removeAllFromExpanded(const QModelIndex &index);
+    void totalNumOfChildren(const QModelIndex& idx,int& num) const;
+    void totalNumOfExpandedChildren(const QModelIndex& idx,int& num) const;
+
+    inline bool isIndexExpanded(const QModelIndex &idx) const
+    {
+        //We first check if the idx is a QPersistentModelIndex, because creating QPersistentModelIndex is slow
+        return expandedIndexes.contains(idx);
+    }
 
+    //selection
     void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command);
     void select(const QModelIndex &topIndex, const QModelIndex &bottomIndex,
                                   QItemSelectionModel::SelectionFlags command);
@@ -132,65 +144,61 @@ protected:
 
     QRegion visualRegionForSelection(const QItemSelection &selection) const;
 
-    int  firstVisibleItem(int &offset) const;
-    void updateRowCount();
-    void updateScrollBars();
+    virtual void updateViewport(const QRect rect)=0;
+
+    virtual int  firstVisibleItem(int &offset) const=0;
+    virtual void updateRowCount()=0;
+    virtual void updateScrollBars()=0;
     void adjustWidthInParent(int start);
-    //void shiftItems(int start);
-    //void shiftItems(int start,int diff);
 
+    void setIndentation(int i) {indentation_=i;}
     void setExpectedBg(QColor c) {expectedBg_=c;}
     void setConnectorColour(QColor c) {connectorColour_=c;}
+    void setDrawConnector(bool b) {drawConnector_=b;}
+
+    void insertViewItems(int pos, int count, const TreeNodeViewItem &viewItem);
+    void removeViewItems(int pos, int count);
+
+    int translation() const;
 
     enum ScrollMode {
           ScrollPerItem,
           ScrollPerPixel
       };
 
-    TreeNodeModel* model_;
-    CompactNodeViewDelegate* delegate_;
-
-    // used when expanding and collapsing items
-    QSet<QPersistentModelIndex> expandedIndexes;
-
-private:
-    int totalNumOfChildren(const QModelIndex& idx,int& num) const;
-    int totalNumOfExpandedChildren(const QModelIndex& idx,int& num) const;
-    void expand(int item);
-    void collapse(int item);
-    bool collapseAllCore(const QModelIndex &index);
-
-    void insertViewItems(int pos, int count, const CompactViewItem &viewItem);
-    void removeViewItems(int pos, int count);
-
-    void doDelayedWidthAdjustment();
 
-    int connectorPos(CompactViewItem* item, CompactViewItem* parent) const;
-    int translation() const;
+    TreeNodeModel* model_; //The model
+    TreeNodeViewDelegate* delegate_;
+    QSet<QPersistentModelIndex> expandedIndexes; // used when expanding and collapsing items
 
-    typedef std::vector<CompactViewItem>::iterator ViewItemIterator;
+    typedef std::vector<TreeNodeViewItem>::iterator ViewItemIterator;
     ScrollMode verticalScrollMode_;
-    mutable std::vector<CompactViewItem> viewItems_;
+    mutable std::vector<TreeNodeViewItem> viewItems_;
     int rowCount_;
     int maxRowWidth_;
-    mutable int lastViewedItem_;
     QModelIndex root_;
     int topMargin_;
     int leftMargin_;
     int itemGap_;
     int connectorGap_;
     int expandConnectorLenght_;
-
     QPointer<QItemSelectionModel> selectionModel_;
+    QColor expectedBg_;
+    QColor connectorColour_;
+    bool drawConnector_;
+    int indentation_;
+
+private:
+    void expand(int item);
+    void collapse(int item);
+    bool collapseAllCore(const QModelIndex &index);
+
+    mutable int lastViewedItem_;
     QPoint pressedPosition_;
     QPersistentModelIndex pressedIndex_;
     QPersistentModelIndex pressedRefIndex_;
-    bool noSelectionOnMousePress_;
-    QStyledItemDelegate* itemDelegate_;
-    QColor expectedBg_;
-    QColor connectorColour_;
+    bool noSelectionOnMousePress_;   
     QBasicTimer delayedWidth_;
-    int delayedTimeout_;
 
     inline bool storeExpanded(const QPersistentModelIndex &idx)
     {
@@ -200,17 +208,12 @@ private:
             return true;
     }
 
-    inline bool isIndexExpanded(const QModelIndex &idx) const
-    {
-        //We first check if the idx is a QPersistentModelIndex, because creating QPersistentModelIndex is slow
-        return expandedIndexes.contains(idx);
-    }
-
     inline QItemSelectionModel::SelectionFlags selectionBehaviorFlags() const
     {
         return QItemSelectionModel::NoUpdate;
     }
 };
 
-#endif // COMPACTVIEW_HPP
+#endif // ABSTRACTNODEVIEW_HPP
+
 
diff --git a/Viewer/src/ActionHandler.cpp b/Viewer/src/ActionHandler.cpp
index ab6e602..2dbd90c 100644
--- a/Viewer/src/ActionHandler.cpp
+++ b/Viewer/src/ActionHandler.cpp
@@ -31,19 +31,23 @@
 #include "CustomCommandDialog.hpp"
 #include "UiLog.hpp"
 #include "UserMessage.hpp"
+#include "VConfig.hpp"
 
 #define _UI_ACTIONHANDLER_DEBUG
 
-ActionHandler::ActionHandler(QWidget *view) : QObject(view), parent_(view)
+ActionHandler::ActionHandler(QObject *actionSender,QWidget* menuParent) :
+    QObject(actionSender),
+    actionSender_(actionSender),
+    menuParent_(menuParent)
 {
 	connect(this,SIGNAL(viewCommand(VInfo_ptr,QString)),
-			parent_,SLOT(slotViewCommand(VInfo_ptr,QString)));
+            actionSender_,SLOT(slotViewCommand(VInfo_ptr,QString)));
 
 	connect(this,SIGNAL(infoPanelCommand(VInfo_ptr,QString)),
-			parent_,SIGNAL(infoPanelCommand(VInfo_ptr,QString)));
+            actionSender_,SIGNAL(infoPanelCommand(VInfo_ptr,QString)));
 
 	connect(this,SIGNAL(dashboardCommand(VInfo_ptr,QString)),
-			parent_,SIGNAL(dashboardCommand(VInfo_ptr,QString)));
+            actionSender_,SIGNAL(dashboardCommand(VInfo_ptr,QString)));
 
 	//makeShortcut();
 }
@@ -80,8 +84,8 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
 
 
 
-    std::string view=parent_->property("view").toString().toStdString();
-    MenuItem* item=MenuHandler::invokeMenu("Node", filteredNodes, pos,  parent_,view);
+    std::string view=menuParent_->property("view").toString().toStdString();
+    MenuItem* item=MenuHandler::invokeMenu("Node", filteredNodes, pos,  menuParent_,view);
 
     if(item)
     {
@@ -99,7 +103,7 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
             Q_EMIT dashboardCommand(filteredNodes.at(0),QString::fromStdString(item->command()));
     		return;
     	}
-    	else if(item->handler() == "tree")
+        else if(item->handler() == "tree" || item->handler() == "table" || item->handler() == "trigger")
     	{
             Q_EMIT viewCommand(filteredNodes.at(0),QString::fromStdString(item->command()));
     		return;
@@ -250,7 +254,14 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
             if (item->isCustom())
                 MenuHandler::interceptCommandsThatNeedConfirmation(item);
 
-            if(item && !item->question().empty() && item->shouldAskQuestion(filteredNodes))
+            bool needQuestion=item && !item->question().empty() && item->shouldAskQuestion(filteredNodes);
+
+            //We can control if a confrmation is needed for a command from the config dialogue
+            if(needQuestion && !item->questionControl().empty())
+                if(VProperty* prop=VConfig::instance()->find(item->questionControl()))
+                    needQuestion=prop->value().toBool();
+
+            if(needQuestion)
         	{
                 std::string fullNames("<ul>");
                 std::string nodeNames("<ul>");
@@ -274,7 +285,7 @@ void ActionHandler::contextMenu(std::vector<VInfo_ptr> nodesLst,QPoint pos)
                         nodeNames += filteredNodes[i]->name();
                         nodeNames += "</b></li>";                    
                     }
-                    if(numItemsToList < filteredNodes.size())
+                    if(numItemsToList < static_cast<int>(filteredNodes.size()))
                     {                  
                         std::string numExtra = QString::number(numNodes-numItemsToList).toStdString();
 
diff --git a/Viewer/src/ActionHandler.hpp b/Viewer/src/ActionHandler.hpp
index 5861b1c..672d7bd 100644
--- a/Viewer/src/ActionHandler.hpp
+++ b/Viewer/src/ActionHandler.hpp
@@ -26,7 +26,7 @@ class ActionHandler : public QObject
 {
 Q_OBJECT
 public:
-		explicit ActionHandler(QWidget*);
+        explicit ActionHandler(QObject*,QWidget* menuParent);
 
 		void contextMenu(std::vector<VInfo_ptr>,QPoint);
 Q_SIGNALS:
@@ -35,7 +35,8 @@ Q_SIGNALS:
 	    void dashboardCommand(VInfo_ptr,QString);
 
 protected:
-		QWidget *parent_;
+        QObject *actionSender_;
+        QWidget *menuParent_;
 
 };
 
diff --git a/Viewer/src/Animation.cpp b/Viewer/src/Animation.cpp
index e127ac2..1ff88e7 100644
--- a/Viewer/src/Animation.cpp
+++ b/Viewer/src/Animation.cpp
@@ -61,7 +61,7 @@ void Animation::renderFrame(int frame)
 	if(targets_.isEmpty())
 		QMovie::stop();
 
-	Q_EMIT(repaintRequest(this));
+    Q_EMIT(repaintRequest(this));
 }
 
 void Animation::notifyServerDelete(ServerHandler* server)
diff --git a/Viewer/src/AstCollateVNodesVisitor.cpp b/Viewer/src/AstCollateVNodesVisitor.cpp
index 07c672c..5eb43e1 100644
--- a/Viewer/src/AstCollateVNodesVisitor.cpp
+++ b/Viewer/src/AstCollateVNodesVisitor.cpp
@@ -57,13 +57,39 @@ void AstCollateVNodesVisitor::visitVariable(AstVariable* astVar)
     {
         if(VNode* n=static_cast<VNode*>(referencedNode->graphic_ptr()))
         {
-            int nType=attrTypes.size();
-            int nItem=items_.size();
-            for(size_t i=0; i < nType; i++)
+            std::size_t nType=attrTypes.size();
+            std::size_t nItem=items_.size();
+            for(std::size_t i=0; i < nType; i++)
             {
                 if(VAttribute *a=n->findAttribute(attrTypes[i],astVar->name()))
                 {
-                    for(size_t k=0; k < nItem; k++)
+                    for(std::size_t k=0; k < nItem; k++)
+                    {
+                        if(a == items_[k])
+                            return;
+                    }
+
+                    items_.push_back(a);
+                        return;
+                }
+            }
+        }
+    }
+}
+
+void AstCollateVNodesVisitor::visitParentVariable(AstParentVariable* astVar)
+{
+    if(Node* referencedNode = astVar->referencedNode())
+    {
+        if(VNode* n=static_cast<VNode*>(referencedNode->graphic_ptr()))
+        {
+            std::size_t nType=attrTypes.size();
+            std::size_t nItem=items_.size();
+            for(std::size_t i=0; i < nType; i++)
+            {
+                if(VAttribute *a=n->findAttribute(attrTypes[i],astVar->name()))
+                {
+                    for(std::size_t k=0; k < nItem; k++)
                     {
                         if(a == items_[k])
                             return;
diff --git a/Viewer/src/AstCollateVNodesVisitor.hpp b/Viewer/src/AstCollateVNodesVisitor.hpp
index dcb83f9..4d4bbaa 100644
--- a/Viewer/src/AstCollateVNodesVisitor.hpp
+++ b/Viewer/src/AstCollateVNodesVisitor.hpp
@@ -46,6 +46,7 @@ public:
   virtual void visitEventState(AstEventState*);
   virtual void visitNode(AstNode*);
   virtual void visitVariable(AstVariable*);
+  virtual void visitParentVariable(AstParentVariable*);
   virtual void visitFlag(AstFlag*);
 
 private:
diff --git a/Viewer/src/AttributeEditor.cpp b/Viewer/src/AttributeEditor.cpp
index f2d552b..95522c3 100644
--- a/Viewer/src/AttributeEditor.cpp
+++ b/Viewer/src/AttributeEditor.cpp
@@ -55,7 +55,7 @@ AttributeEditor::AttributeEditor(VInfo_ptr info,QString type,QWidget* parent) :
 AttributeEditor::~AttributeEditor()
 {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "AttributeEditor::~AttributeEditor -->";
+    UI_FUNCTION_LOG
 #endif
     detachInfo();
 #ifdef _USE_MODELESS_ATTRIBUTEDITOR
@@ -115,7 +115,7 @@ void AttributeEditor::accept()
 void AttributeEditor::attachInfo()
 {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "AttributeEditor::attachInfo -->";
+    UI_FUNCTION_LOG
 #endif
 
     if(info_)
@@ -128,41 +128,33 @@ void AttributeEditor::attachInfo()
 
         info_->addObserver(this);
     } 
-
-#ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "<-- attachInfo";
-#endif
 }
 
 void AttributeEditor::detachInfo()
 {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "AttributeEditor::detachInfo -->";
+    UI_FUNCTION_LOG
 #endif
     if(info_)
     {
         if(info_->server())
         {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-            UiLog().dbg() << " remove NodeObserver";
+            UiLog().dbg() << " remove NodeObserver " << this;
 #endif
             info_->server()->removeNodeObserver(this);
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-            UiLog().dbg() << " remove ServerObserver";
+            UiLog().dbg() << " remove ServerObserver " << this;
 #endif
             info_->server()->removeServerObserver(this);
         }
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-            UiLog().dbg() << " remove InfoObserver";
+        UiLog().dbg() << " remove InfoObserver";
 #endif
-            info_->removeObserver(this);
+        info_->removeObserver(this);
     }
 
     messageLabel_->stopLoadLabel();
-
-#ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "<-- detachInfo";
-#endif
 }
 
 void AttributeEditor::slotButton(QAbstractButton* b)
@@ -174,6 +166,7 @@ void AttributeEditor::slotButton(QAbstractButton* b)
 void AttributeEditor::checkButtonStatus()
 {
     setResetStatus(isValueChanged());
+    setSaveStatus(isValueChanged());
 }
 
 void AttributeEditor::setResetStatus(bool st)
@@ -183,6 +176,13 @@ void AttributeEditor::setResetStatus(bool st)
     resetpb->setEnabled(st);
 }
 
+void AttributeEditor::setSaveStatus(bool st)
+{
+    QPushButton *savepb=buttonBox_->button(QDialogButtonBox::Save);
+    Q_ASSERT(savepb);
+    savepb->setEnabled(st);
+}
+
 void AttributeEditor::setSuspended(bool st)
 {
     UiLog().dbg() << "AttributeEditor::setSuspended --> " << st;
@@ -202,23 +202,20 @@ void AttributeEditor::setSuspended(bool st)
 void AttributeEditor::notifyDataLost(VInfo* info)
 {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "AttributeEditor::notifyDataLost -->";
+    UI_FUNCTION_LOG
 #endif
     if(info_ && info_.get() == info)
     {
         detachInfo();
-        messageLabel_->showWarning("The parent node and the edited " + type_ + " <b>is not available</b> anymore! Please close the dialog!");      
+        messageLabel_->showWarning("The parent node or the edited " + type_ + " <b>is not available</b> anymore! Please close the dialog!");
         setSuspended(true);
     }
-#ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "<-- notifyDataLost";
-#endif
 }
 
 void AttributeEditor::notifyBeginNodeChange(const VNode* vn, const std::vector<ecf::Aspect::Type>& aspect,const VNodeChange&)
 {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "AttributeEditor::notifyBeginNodeChange -->";
+    UI_FUNCTION_LOG
 #endif
     if(info_ && info_->node() && info_->node() == vn)
     {
@@ -228,28 +225,39 @@ void AttributeEditor::notifyBeginNodeChange(const VNode* vn, const std::vector<e
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
             UiLog().dbg() << " ADD_REMOVE_ATTR";
 #endif
-            VAttribute* a=info_->attribute();
-            Q_ASSERT(a);
+            //try to regain the data
+            info_->regainData();
+
+            //If the attribute is not available dataLost() was already called.
+            if(!info_ || !info_->hasData())
+            {
+#ifdef _UI_ATTRIBUTEDITOR_DEBUG
+                UiLog().dbg() << " attribute does not exist";
+#endif
+                return;
+            }
+
+            Q_ASSERT(info_->server() && info_->node());
+            setSuspended(false);
+
+#if 0
             if(1)
-            //if(info->node()->isValidAttribute(a) == false)
-            //if(!a->isValid(info_->node(),attrData_))
             {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
                 UiLog().dbg() << " attribute does not exist";
 #endif
                 detachInfo();
-                messageLabel_->showWarning("The edited " + type_ + " <b>is not available</b> any more! Please close the dialog!");
+                messageLabel_->showWarning("The edited " + type_ +
+                                           " <b>is not available</b> any more! Please close the dialog!");
                 setSuspended(true);
             }
+#endif
         }
         else
         {          
             nodeChanged(aspect);
         }
     }
-#ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "<-- notifyBeginNodeChange";
-#endif
 }
 
 void AttributeEditor::notifyDefsChanged(ServerHandler* server, const std::vector<ecf::Aspect::Type>& a)
@@ -264,24 +272,23 @@ void AttributeEditor::notifyDefsChanged(ServerHandler* server, const std::vector
 void AttributeEditor::notifyServerDelete(ServerHandler* server)
 {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "AttributeEditor::notifyServerDelete -->";
+    UI_FUNCTION_LOG_S(server)
 #endif
     if(info_ && info_->server() == server)
     {
         detachInfo();
-        messageLabel_->showWarning("Server <b>" + QString::fromStdString(server->name()) + "</b> was removed from ecFlowUI! The edited " + type_ + " <b>is not available</b> anymore! Please close the dialog!");
+        messageLabel_->showWarning("Server <b>" + QString::fromStdString(server->name()) +
+                                   "</b> was removed from ecFlowUI! The edited " + type_ +
+                                   " <b>is not available</b> anymore! Please close the dialog!");
         setSuspended(true);
     }
-#ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "<-- notifyServerDelete";
-#endif
 }
     
 //This must be called at the beginning of a reset
 void AttributeEditor::notifyBeginServerClear(ServerHandler* server)
 {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "AttributeEditor::notifyBeginServerClear -->";
+    UI_FUNCTION_LOG_S(server)
 #endif
 
     if(info_)
@@ -297,17 +304,13 @@ void AttributeEditor::notifyBeginServerClear(ServerHandler* server)
             checkButtonStatus();
         }
     }
-
-#ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog().dbg() << "<-- notifyBeginServerClear";
-#endif
 }
 
 //This must be called at the end of a reset
 void AttributeEditor::notifyEndServerScan(ServerHandler* server)
 {
 #ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog(server).dbg() << "AttributeEditor::notifyEndServerScan -->";
+    UI_FUNCTION_LOG_S(server)
 #endif
 
     if(info_)
@@ -318,12 +321,12 @@ void AttributeEditor::notifyEndServerScan(ServerHandler* server)
             messageLabel_->clear();
 
             //We try to ressurect the info. We have to do it explicitly because it is not guaranteed
-            //that notifyEndServerScan() will be first called on the VInfo then on the InfoPanel. So it
+            //that notifyEndServerScan() will be first called on other objects than AttributeEditor. So it
             //is possible that the node exists but is still set to NULL in VInfo.
             info_->regainData();
 
             //If the node is not available dataLost() was already called.
-            if(!info_)
+            if(!info_ || !info_->hasData())
                 return;
 
             Q_ASSERT(info_->server() && info_->node());
@@ -331,10 +334,6 @@ void AttributeEditor::notifyEndServerScan(ServerHandler* server)
             setSuspended(false);
         }
     }
-
-#ifdef _UI_ATTRIBUTEDITOR_DEBUG
-    UiLog(server).dbg() << "<-- notifyEndServerScan";
-#endif
 }
 
 void AttributeEditor::notifyServerConnectState(ServerHandler* server)
diff --git a/Viewer/src/AttributeEditor.hpp b/Viewer/src/AttributeEditor.hpp
index e75b543..30fe8b5 100644
--- a/Viewer/src/AttributeEditor.hpp
+++ b/Viewer/src/AttributeEditor.hpp
@@ -57,6 +57,7 @@ protected:
     void detachInfo();
     void checkButtonStatus();
     void setResetStatus(bool st);
+    void setSaveStatus(bool st);
     void setSuspended(bool);
     void addForm(QWidget* w);
     void hideForm();
diff --git a/Viewer/src/AttributeEditorDialog.ui b/Viewer/src/AttributeEditorDialog.ui
index 3401dcf..6d07ba3 100644
--- a/Viewer/src/AttributeEditorDialog.ui
+++ b/Viewer/src/AttributeEditorDialog.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>275</width>
+    <width>281</width>
     <height>171</height>
    </rect>
   </property>
@@ -65,7 +65,7 @@
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset</set>
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Reset|QDialogButtonBox::Save</set>
      </property>
     </widget>
    </item>
diff --git a/Viewer/src/CMakeLists.txt b/Viewer/src/CMakeLists.txt
index fede923..5ba0c93 100644
--- a/Viewer/src/CMakeLists.txt
+++ b/Viewer/src/CMakeLists.txt
@@ -3,6 +3,7 @@ set(viewer_srcs
     ViewerMain.cpp
     AboutDialog.cpp
     AbstractNodeModel.cpp
+    AbstractNodeView.cpp
     AbstractSearchLine.cpp
     AbstractTextEditSearchInterface.cpp
     ActionHandler.cpp
@@ -20,8 +21,6 @@ set(viewer_srcs
     ComboMulti.cpp
     CommandDesignerWidget.cpp
     CompactView.cpp
-    CompactNodeView.cpp
-    CompactNodeViewDelegate.cpp
     ConfigListDelegate.cpp
     ConnectState.cpp
     CustomCommandDialog.cpp
@@ -37,6 +36,7 @@ set(viewer_srcs
     EditItemWidget.cpp
     EditProvider.cpp
     EditorInfoLabel.cpp
+    ExpandState.cpp
     ExpandStateNode.cpp
     FlagSet.hpp
     FileInfoLabel.cpp
@@ -113,6 +113,7 @@ set(viewer_srcs
     RepeatEditor.cpp
     SaveSessionAsDialog.cpp
     ScriptItemWidget.cpp
+    ServerComInfoWidget.cpp
     ServerComQueue.cpp
     ServerComThread.cpp
     ServerDefsAccess.cpp
@@ -127,6 +128,7 @@ set(viewer_srcs
     SessionRenameDialog.cpp
     SessionHandler.cpp
     Sound.cpp
+    StandardView.cpp
     StringMatchCombo.cpp
     StringMatchMode.cpp
     SuiteItemWidget.cpp
@@ -144,19 +146,21 @@ set(viewer_srcs
     RichTextSearchInterface.cpp
     RichTextSearchLine.cpp
     TextEditSearchLine.cpp
-    TimeItemWidget.cpp    
-    TriggerBrowser.cpp
-    TriggerEditor.cpp
-    TriggerItemWidget.cpp
-    TriggerTextWidget.cpp
+    TimeItemWidget.cpp
+    ToolTipFormat.cpp
     TreeNodeModel.cpp
     TreeNodeView.cpp
     TreeNodeViewDelegate.cpp
-    TreeNodeViewDelegateBase.cpp
     TreeNodeWidget.cpp
     TreeView.cpp
+    TriggerEditor.cpp   
+    TriggerItemWidget.cpp
+    TriggerTextWidget.cpp    
     TriggerCollector.cpp
-    TriggerView.cpp
+    TriggerTableModel.cpp
+    TriggerTableView.cpp
+    TriggerTableWidget.cpp
+    TriggerViewDelegate.cpp
     TriggeredScanner.cpp
     UIDebug.cpp
     UiLog.cpp
@@ -198,6 +202,7 @@ set(viewer_srcs
     VTriggerAttr.cpp
     VGenVarAttr.cpp
     VUserVarAttr.cpp
+    VariableEditor.cpp
     VariableModel.cpp
     VariableModelData.cpp
     VariableItemWidget.cpp
@@ -227,6 +232,7 @@ endif()
 
 
 set(viewer_moc_files AbstractNodeModel.hpp
+    AbstractNodeView.hpp
     AbstractSearchLine.hpp
     ActionHandler.hpp
     Animation.hpp
@@ -239,8 +245,6 @@ set(viewer_moc_files AbstractNodeModel.hpp
     CodeItemWidget.hpp
     ComboMulti.hpp
     CommandDesignerWidget.hpp    
-    CompactView.hpp
-    CompactNodeView.hpp
     CustomCommandDialog.hpp
     CustomListWidget.hpp
     Dashboard.hpp
@@ -263,6 +267,7 @@ set(viewer_moc_files AbstractNodeModel.hpp
     LogTruncator.hpp
     MainWindow.hpp
     MenuConfigDialog.hpp
+    MessageItemWidget.hpp
     MeterEditor.hpp
     NodeFilterDialog.hpp
     NodePanel.hpp
@@ -293,6 +298,7 @@ set(viewer_moc_files AbstractNodeModel.hpp
     SaveSessionAsDialog.hpp
     RepeatEditor.hpp
     RichTextEdit.hpp
+    ServerComInfoWidget.hpp
     ServerComQueue.hpp
     ServerComThread.hpp
     ServerHandler.hpp
@@ -311,13 +317,15 @@ set(viewer_moc_files AbstractNodeModel.hpp
     TableNodeWidget.hpp             
     TextEditSearchLine.hpp
     TreeNodeModel.hpp
-    TreeNodeView.hpp           
-    TreeNodeViewDelegateBase.hpp
-    TreeNodeWidget.hpp
-    TriggerBrowser.hpp
+    TreeNodeView.hpp
+    TreeNodeViewDelegate.hpp
+    TreeNodeWidget.hpp    
     TriggerEditor.hpp
     TriggerItemWidget.hpp
+    TriggerTableView.hpp
+    TriggerTableWidget.hpp
     TriggeredScanner.hpp
+    VariableEditor.hpp
     VariableItemWidget.hpp
     VariableModel.hpp
     VariableModelData.hpp
@@ -382,10 +390,11 @@ set(viewer_wrap_ui_files
     TableNodeWidget.ui
     TimeItemWidget.ui
     TreeNodeWidget.ui
-    TriggerBrowser.ui
     TriggerEditorWidget.ui
     TriggerItemWidget.ui
+    TriggerTableWidget.ui
     VariableAddDialog.ui
+    VariableEditorWidget.ui
     VariablePropDialog.ui
     VariableItemWidget.ui
     ZombieItemWidget.ui
@@ -427,7 +436,7 @@ ecbuild_add_executable( TARGET   ecflow_ui.x
      TextPager    
      ${Boost_INCLUDE_DIRS} 
      ${CMAKE_CURRENT_BINARY_DIR}
-    LIBS core nodeattr node libparser base libclient 
+    LIBS core nodeattr node base libclient 
          pthread  
          m dl
          ${ECFLOW_QT_LIBRARIES}
@@ -456,7 +465,7 @@ if(${build_ecflow_ui_log})
          ../../Client/src     
          ${Boost_INCLUDE_DIRS} 
          ${CMAKE_CURRENT_BINARY_DIR}
-        LIBS core nodeattr node libparser base libclient 
+        LIBS core nodeattr node base libclient 
              pthread  
              m 
              ${ECFLOW_QT_LIBRARIES}
diff --git a/Viewer/src/ChangeNotify.cpp b/Viewer/src/ChangeNotify.cpp
index 1bf0eb9..d55a653 100644
--- a/Viewer/src/ChangeNotify.cpp
+++ b/Viewer/src/ChangeNotify.cpp
@@ -13,6 +13,7 @@
 #include "ChangeNotifyDialog.hpp"
 #include "ChangeNotifyModel.hpp"
 #include "ChangeNotifyWidget.hpp"
+#include "ServerHandler.hpp"
 #include "Sound.hpp"
 #include "UiLog.hpp"
 #include "VConfig.hpp"
@@ -54,7 +55,8 @@ ChangeNotify::ChangeNotify(const std::string& id) :
 	data_(0),
 	model_(0),
 	proxyModel_(0),
-	prop_(0)
+    prop_(0),
+    propEnabled_(0)
 {
 	data_=new VNodeList();
 	model_=new ChangeNotifyModel();
@@ -62,8 +64,6 @@ ChangeNotify::ChangeNotify(const std::string& id) :
 
 	proxyModel_=new QSortFilterProxyModel();
 	proxyModel_->setSourceModel(model_);
-	//proxyModel_->setFilterFixedString("1");
-	//proxyModel_->setFilterKeyColumn(0);
 	proxyModel_->setDynamicSortFilter(true);
 
 	items[id] = this;
@@ -107,7 +107,7 @@ void ChangeNotify::add(VNode *node,bool popup,bool sound)
 		{
 			if(VProperty* p=prop_->findChild("sound_system_file"))
 			{
-				fName=p->valueAsString();
+				fName=p->valueAsStdString();
 			}
 		}
 
@@ -198,28 +198,49 @@ void ChangeNotify::setProperty(VProperty* prop)
 
 void ChangeNotify::notifyChange(VProperty* prop)
 {
-	if(prop->name().contains("sound",Qt::CaseInsensitive))
+    Q_ASSERT(prop);
+
+    if(prop->name().contains("sound",Qt::CaseInsensitive))
 		return;
 
-	if(prop->name() == "max_item_num")
+    else if(prop->name() == "max_item_num")
 	{
 		data_->setMaxNum(prop->value().toInt());
 	}
+    //The central settings changed
+    else if(prop == propEnabled_)
+    {
+        //Check if there is any loaded server with this
+        //notification enabled
+        bool hasEnabledServer=ServerHandler::checkNotificationState(id_);
+        updateNotificationState(hasEnabledServer);
+    }
 
 	dialog()->updateSettings(this);
 	ChangeNotifyWidget::updateSettings(id_);
 }
 
+void ChangeNotify::updateNotificationState(bool hasEnabledServer)
+{
+    if(propEnabled_)
+        setEnabled(propEnabled_->value().toBool() || hasEnabledServer);
+    else
+        setEnabled(hasEnabledServer);
+}
+
+
 void ChangeNotify::clearData()
 {
 	data_->clear();
 	//proxyModel_->invalidate();
 }
 
-void ChangeNotify::showDialog()
+void ChangeNotify::showDialog(ChangeNotify* notifier)
 {
-	dialog()->setCurrentTab(this);
-	dialog()->show();
+    if(notifier)
+        dialog()->setCurrentTab(notifier);
+
+    dialog()->show();
 	dialog()->raise();
 }
 
@@ -246,12 +267,12 @@ void ChangeNotify::remove(const std::string& id,VNode *node)
 	}
 }
 
-void ChangeNotify::setEnabled(const std::string& id,bool en)
+void ChangeNotify::updateNotificationStateFromServer(const std::string& id,bool en)
 {
-	if(ChangeNotify* obj=ChangeNotify::find(id))
-	{
-		obj->setEnabled(en);
-	}
+    if(ChangeNotify* obj=ChangeNotify::find(id))
+    {
+        obj->updateNotificationState(en);
+    }
 }
 
 ChangeNotify*  ChangeNotify::find(const std::string& id)
@@ -265,10 +286,10 @@ ChangeNotify*  ChangeNotify::find(const std::string& id)
 
 void ChangeNotify::load(VProperty* group)
 {
-	if(group->name() == "notification")
-	{
-        UiLog().dbg() << "ChangeNotify:load() -- > notification";
+UI_FUNCTION_LOG
 
+    if(group->name() == "notification")
+	{
 		for(int i=0; i < group->children().size(); i++)
 		{
 			VProperty *p=group->children().at(i);
@@ -304,21 +325,27 @@ void ChangeNotify::load(VProperty* group)
 	}
 }
 
+//Called only once during init
 void ChangeNotify::loadServerSettings()
 {
-    UiLog().dbg() << "ChangeNotify::loadServerSettings() --> " << id_;
+UI_FUNCTION_LOG
+
+    UiLog().dbg() << " id=" << id_;
 
 	std::string v("server.notification." + id_ + ".enabled");
-    UiLog().dbg() << " property: " <<  v;
+
+    UiLog().dbg() << " property=" <<  v;
 
 	if(VProperty *p=VConfig::instance()->find(v))
-	{
-		setEnabled(p->value().toBool());
+	{        
+        propEnabled_=p;
+        p->addObserver(this);
+        setEnabled(p->value().toBool());
 	}
 	else
 	{
         UiLog().err() << "  Error!  Unable to find property: " << v;
-	}
+    }
 }
 
 ChangeNotifyDialog* ChangeNotify::dialog()
diff --git a/Viewer/src/ChangeNotify.hpp b/Viewer/src/ChangeNotify.hpp
index bea9d78..5847286 100644
--- a/Viewer/src/ChangeNotify.hpp
+++ b/Viewer/src/ChangeNotify.hpp
@@ -38,17 +38,15 @@ public:
 	QSortFilterProxyModel* proxyModel() const {return proxyModel_;}
 	bool isEnabled() const {return enabled_;}
 	void clearData();
-	void showDialog();
+    static void showDialog(ChangeNotify* notifier=0);
 
 	//Form VPropertyObserver
 	void notifyChange(VProperty*);
 
 	static void add(const std::string&,VNode*,bool,bool);
 	static void remove(const std::string&,VNode*);
-	static void setEnabled(const std::string&,bool);
 	static void populate(ChangeNotifyWidget* w);
-	//static void showDialog(const std::string& id);
-	//static void clearData(const std::string& id);
+    static void updateNotificationStateFromServer(const std::string& id,bool hasEnabledServer);
 
 	//Called from VConfigLoader
 	static void load(VProperty* group);
@@ -57,7 +55,8 @@ protected:
 	void add(VNode*,bool,bool);
 	void remove(VNode*);
 	void setEnabled(bool);
-	void setProperty(VProperty* prop);
+    void updateNotificationState(bool hasEnabledServer);
+    void setProperty(VProperty* prop);
 	void loadServerSettings();
     virtual void loadNodeState() {}
 
@@ -70,6 +69,7 @@ protected:
 	ChangeNotifyModel* model_;
 	QSortFilterProxyModel* proxyModel_;
 	VProperty* prop_;
+    VProperty* propEnabled_; //central settings in config GUI
 	static ChangeNotifyDialog* dialog_;
 };
 
diff --git a/Viewer/src/ChangeNotifyDialog.cpp b/Viewer/src/ChangeNotifyDialog.cpp
index b876ba9..b0f5c85 100644
--- a/Viewer/src/ChangeNotifyDialog.cpp
+++ b/Viewer/src/ChangeNotifyDialog.cpp
@@ -21,8 +21,10 @@
 
 #include <QCloseEvent>
 #include <QDebug>
+#include <QHBoxLayout>
 #include <QPainter>
 #include <QSettings>
+#include <QToolButton>
 #include <QVariant>
 
 Q_DECLARE_METATYPE(QList<int>)
@@ -82,7 +84,9 @@ void ChangeNotifyDialogWidget::slotReset()
 
 void ChangeNotifyDialogWidget::update(ChangeNotify* notifier)
 {
-	QColor bgCol(Qt::gray);
+
+#if 0
+    QColor bgCol(Qt::gray);
 	if(VProperty *p=notifier->prop()->findChild("fill_colour"))
 		bgCol=p->value().value<QColor>();
 
@@ -93,6 +97,7 @@ void ChangeNotifyDialogWidget::update(ChangeNotify* notifier)
 					     stop: 0 " + bgLight.name() + ", stop: 1 " + bgLight.name() + "); }";
 
 	label_->setStyleSheet(st);
+#endif
 }
 
 void ChangeNotifyDialogWidget::slotSelectItem(const QModelIndex& idx)
@@ -177,9 +182,23 @@ ChangeNotifyDialog::ChangeNotifyDialog(QWidget *parent) :
 	grad_.setStart(0,0);
 	grad_.setFinalStop(0,1);
 
+
+    QToolButton* optionsTb=new QToolButton(this);
+    //optionsTb->setAutoRaise(true);
+    optionsTb->setText(tr("&Prefrences"));
+    optionsTb->setIcon(QPixmap(":/viewer/configure.svg"));
+    optionsTb->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+    optionsTb->setToolTip(tr("Configure notification options"));
+
+    connect(optionsTb,SIGNAL(clicked()),
+            this,SLOT(slotOptions()));
+
+    tab_->setCornerWidget(optionsTb);
+
 	readSettings();
 
     WidgetNameProvider::nameChildren(this);
+
 }
 
 ChangeNotifyDialog::~ChangeNotifyDialog()
@@ -198,15 +217,20 @@ void ChangeNotifyDialog::addTab(ChangeNotify* notifier)
     connect(w,SIGNAL(selectionChanged(VInfo_ptr)),
             this,SLOT(slotSelectionChanged(VInfo_ptr)));
 
+    VProperty* prop=notifier->prop();
+    Q_ASSERT(prop);
+
 	ignoreCurrentChange_=true;
-	tab_->addTab(w,"");
+    tab_->addTab(w,prop->param("labelText"));
 	ignoreCurrentChange_=false;
 
 	tabWidgets_ << w;
 
 	int idx=tab_->count()-1;
-	if(idx ==  tab_->currentIndex())
+#if 0
+    if(idx ==  tab_->currentIndex())
 		updateStyleSheet(notifier->prop());
+#endif
 
 	decorateTab(idx,notifier);
 
@@ -230,9 +254,20 @@ void ChangeNotifyDialog::slotSelectionChanged(VInfo_ptr info)
     MainWindow::changeNotifySelectionChanged(info);
 }
 
+void ChangeNotifyDialog::slotOptions()
+{
+    QString op="notification";
+    if(ChangeNotify* notifier=tabToNtf(tab_->currentIndex()))
+    {
+        op+="." + QString::fromStdString(notifier->id());
+    }
+    MainWindow::startPreferences(op);
+}
+
 void ChangeNotifyDialog::updateStyleSheet(VProperty *currentProp)
 {
-	QColor bgCol(Qt::gray);
+#if 0
+    QColor bgCol(Qt::gray);
 	if(VProperty *p=currentProp->findChild("fill_colour"))
 		bgCol=p->value().value<QColor>();
 
@@ -243,19 +278,37 @@ void ChangeNotifyDialog::updateStyleSheet(VProperty *currentProp)
 						stop: 0 " + bgLight.name() + ", stop: 1 " + bgCol.name() + "); }";
 
 	tab_->setStyleSheet(st);
+#endif
 }
 
 void ChangeNotifyDialog::decorateTabs()
 {
-	for(int i=0; i < tab_->count(); i++)
+    for(int i=0; i < tab_->count(); i++)
 	{
 		decorateTab(i,tabWidgets_.at(i)->notifier());
-	}
+	}    
 }
 
 void ChangeNotifyDialog::decorateTab(int tabIdx,ChangeNotify* notifier)
 {
-	if(tabIdx == -1 || !notifier)
+    if(tabIdx == -1 || !notifier)
+        return;
+
+    VProperty *prop=notifier->prop();
+    QString numText;
+    if(notifier->data())
+    {
+        int num=notifier->data()->size();
+        if(num > 0)
+            numText=" (" + QString::number(num) + ")";
+    }
+    QString labelText=prop->param("labelText")+ numText;
+
+    tab_->setTabText(tabIdx,labelText);
+
+
+#if 0
+    if(tabIdx == -1 || !notifier)
 		return;
 
 	VProperty *prop=notifier->prop();
@@ -356,15 +409,14 @@ void ChangeNotifyDialog::decorateTab(int tabIdx,ChangeNotify* notifier)
 		setIcon(pix);
 	*/
 
-
-
 	pix.fill(Qt::transparent);
 
 	QRect textRect=QRect(margin,0,textW,pix.height());
 	painter.setPen(fgCol);
 	painter.drawText(textRect,Qt::AlignVCenter|Qt::AlignHCenter,labelText);
 
-	if(tabIdx != tab_->currentIndex())
+
+    if(tabIdx != tab_->currentIndex())
 	{
 		QRect lineRect(textRect.left(),pix.height()/2+textH/2+1,
 					   textRect.width(),3);
@@ -386,7 +438,8 @@ void ChangeNotifyDialog::decorateTab(int tabIdx,ChangeNotify* notifier)
 		painter.drawText(numRect,Qt::AlignHCenter|Qt::AlignVCenter,numText);
 	}*/
 
-	tab_->setCustomIcon(tabIdx,pix);
+    tab_->setCustomIcon(tabIdx,pix);
+#endif
 }
 
 
diff --git a/Viewer/src/ChangeNotifyDialog.hpp b/Viewer/src/ChangeNotifyDialog.hpp
index a6b09b6..eb8daa3 100644
--- a/Viewer/src/ChangeNotifyDialog.hpp
+++ b/Viewer/src/ChangeNotifyDialog.hpp
@@ -79,6 +79,7 @@ public Q_SLOTS:
 
 protected Q_SLOTS:
     void slotSelectionChanged(VInfo_ptr);
+    void slotOptions();
 
 protected:
 	ChangeNotify* tabToNtf(int tabIdx);
diff --git a/Viewer/src/ChangeNotifyWidget.cpp b/Viewer/src/ChangeNotifyWidget.cpp
index c40c9f5..ce52a7c 100644
--- a/Viewer/src/ChangeNotifyWidget.cpp
+++ b/Viewer/src/ChangeNotifyWidget.cpp
@@ -11,6 +11,7 @@
 #include "ChangeNotifyWidget.hpp"
 
 #include <QHBoxLayout>
+#include <QLabel>
 #include <QPainter>
 #include <QSignalMapper>
 #include <QToolButton>
@@ -33,7 +34,7 @@ ChangeNotifyButton::ChangeNotifyButton(QWidget* parent) :
 
 	grad_.setCoordinateMode(QGradient::ObjectBoundingMode);
 	grad_.setStart(0,0);
-	grad_.setFinalStop(0,1);
+    grad_.setFinalStop(0,1);
 }
 
 void ChangeNotifyButton::setNotifier(ChangeNotify* notifier)
@@ -75,7 +76,7 @@ void ChangeNotifyButton::slotReset()
 
 void ChangeNotifyButton::slotClicked(bool)
 {
-	notifier_->showDialog();
+    ChangeNotify::showDialog(notifier_);
 }
 
 void ChangeNotifyButton::updateIcon()
@@ -98,13 +99,13 @@ void ChangeNotifyButton::updateIcon()
 
 	}
 
-	QColor bgCol(Qt::gray);
-	QColor fgCol(Qt::black);
+    QColor bgCol(198,198,199);
+    QColor fgCol(20,20,20);
 	QColor countBgCol(58,126,194);
 	QColor countFgCol(Qt::white);
-	QColor border;
 
-	if(notifier_->prop())
+#if 0
+    if(notifier_->prop())
 	{
 		if(VProperty *p=notifier_->prop()->findChild("fill_colour"))
 			bgCol=p->value().value<QColor>();
@@ -120,10 +121,11 @@ void ChangeNotifyButton::updateIcon()
 
 		border=notifier_->prop()->paramToColour("border");
 	}
+#endif
 
 	QFont f;
-	f.setBold(true);
-	f.setPointSize(f.pointSize());
+    //f.setBold(true);
+    f.setPointSize(f.pointSize());
 	QFontMetrics fm(f);
 
     QFont fNum;
@@ -147,12 +149,13 @@ void ChangeNotifyButton::updateIcon()
 
 	QRect textRect(0,0,fm.width(text)+6,h);
 
-	QColor bgLight=bgCol.lighter(150);
+    QColor bgLight=bgCol.lighter(110);
 	grad_.setColorAt(0,bgLight);
 	grad_.setColorAt(1,bgCol);
 
-	painter.setBrush(QBrush(grad_));
-    painter.setPen(bgCol.darker(150));
+    painter.setBrush(QBrush(grad_));
+    //painter.setBrush(bgCol);
+    painter.setPen(bgCol.darker(170));
 	painter.drawRoundedRect(textRect,2,2);
 	painter.setPen(fgCol);
 	painter.setFont(f);
@@ -179,6 +182,14 @@ ChangeNotifyWidget::ChangeNotifyWidget(QWidget *parent) : QWidget(parent)
 	layout_->setContentsMargins(0,0,0,0);
 	layout_->setSpacing(0);
 
+    QLabel* label=new QLabel("<b>Notifications</b>: ",this);
+    label->setStyleSheet("QLabel{color: " + QColor(60,60,60).name() + ";}");
+    //QFont f;
+    //f.setBold(true);
+    //f.setPointSize(f.pointSize()-1);
+    //label->setFont(f);
+    layout_->addWidget(label);
+
 	ChangeNotify::populate(this);
 
 	widgets_.push_back(this);
@@ -200,16 +211,19 @@ ChangeNotifyButton* ChangeNotifyWidget::findButton(const std::string& id)
 	return 0;
 }
 
-
 void ChangeNotifyWidget::addTb(ChangeNotify* notifier)
 {
 	ChangeNotifyButton *tb=new ChangeNotifyButton(this);
 	tb->setNotifier(notifier);
 	layout_->addWidget(tb);
 	if(!notifier->isEnabled())
-		tb->setEnabled(false);
+    {
+        tb->setEnabled(false);
+        tb->hide();
+    }
 
 	buttons_[notifier->id()]=tb;
+    updateVisibility();
 }
 
 void ChangeNotifyWidget::setEnabled(const std::string& id,bool b)
@@ -218,9 +232,28 @@ void ChangeNotifyWidget::setEnabled(const std::string& id,bool b)
 	{
 		if(ChangeNotifyButton* tb=(*it)->findButton(id))
 		{
-			tb->setEnabled(b);
+            tb->setEnabled(b);
+            tb->setVisible(b);
+            (*it)->updateVisibility();
 		}
-	}
+
+    }
+}
+
+void ChangeNotifyWidget::updateVisibility()
+{
+    setVisible(hasVisibleButton());
+}
+
+bool ChangeNotifyWidget::hasVisibleButton() const
+{
+    for(std::map<std::string,ChangeNotifyButton*>::const_iterator it=buttons_.begin();
+        it != buttons_.end(); ++it)
+    {
+        if(it->second->isEnabled())
+            return true;
+    }
+    return false;
 }
 
 void ChangeNotifyWidget::updateSettings(const std::string& id)
diff --git a/Viewer/src/ChangeNotifyWidget.hpp b/Viewer/src/ChangeNotifyWidget.hpp
index 340ee44..aaec102 100644
--- a/Viewer/src/ChangeNotifyWidget.hpp
+++ b/Viewer/src/ChangeNotifyWidget.hpp
@@ -20,6 +20,7 @@
 #include <vector>
 
 class QHBoxLayout;
+class QLabel;
 class QSignalMapper;
 
 class ChangeNotify;
@@ -58,12 +59,14 @@ public:
 	explicit ChangeNotifyWidget(QWidget *parent=0);
 	~ChangeNotifyWidget();
 
+    void updateVisibility();
 	static void setEnabled(const std::string& id,bool b);
 	static void updateSettings(const std::string& id);
 
 protected:
 	void addTb(ChangeNotify*);
-	ChangeNotifyButton* findButton(const std::string& id);
+    ChangeNotifyButton* findButton(const std::string& id);
+    bool hasVisibleButton() const;
 
 	QHBoxLayout* layout_;
 	std::map<std::string,ChangeNotifyButton*> buttons_;
diff --git a/Viewer/src/CompactNodeView.cpp b/Viewer/src/CompactNodeView.cpp
deleted file mode 100644
index 90819a8..0000000
--- a/Viewer/src/CompactNodeView.cpp
+++ /dev/null
@@ -1,555 +0,0 @@
-//============================================================================
-// Copyright 2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 "CompactNodeView.hpp"
-
-#include <QDebug>
-#include <QMouseEvent>
-#include <QScrollBar>
-#include <QTime>
-
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
-#include <QGuiApplication>
-#endif
-
-#include "ActionHandler.hpp"
-#include "Animation.hpp"
-#include "AttributeEditor.hpp"
-#include "CompactNodeViewDelegate.hpp"
-#include "ExpandState.hpp"
-#include "PropertyMapper.hpp"
-#include "TreeNodeModel.hpp"
-#include "TreeNodeViewDelegate.hpp"
-#include "UIDebug.hpp"
-#include "UiLog.hpp"
-#include "VFilter.hpp"
-#include "VModelData.hpp"
-#include "VTree.hpp"
-
-#define _UI_COMPACTNODEVIEW_DEBUG
-
-CompactNodeView::CompactNodeView(TreeNodeModel* model,NodeFilterDef* filterDef,QWidget* parent) :
-    CompactView(model,parent),
-    NodeViewBase(filterDef),    
-    needItemsLayout_(false),
-    //defaultIndentation_(indentation()),
-    prop_(NULL),
-    setCurrentIsRunning_(false),
-    setCurrentFromExpand_(false),
-    inStartUp_(true)
-{
-    setObjectName("view");
-    setProperty("style","nodeView");
-    setProperty("view","tree");
-
-    setContextMenuPolicy(Qt::CustomContextMenu);
-
-    //Context menu
-    connect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
-            this, SLOT(slotContextMenu(const QPoint &)));
-
-    //Selection
-    connect(this,SIGNAL(doubleClicked(const QModelIndex&)),
-            this,SLOT(slotDoubleClickItem(const QModelIndex)));
-
-    //expandState_=new ExpandState(this,model_);
-    actionHandler_=new ActionHandler(this);
-
-    connect(delegate_,SIGNAL(sizeHintChangedGlobal()),
-            this,SLOT(slotSizeHintChangedGlobal()));
-
-    //Properties
-    std::vector<std::string> propVec;
-    propVec.push_back("view.tree.background");
-    propVec.push_back("view.tree.branchLineColour");
-    propVec.push_back("view.tree.serverToolTip");
-    propVec.push_back("view.tree.nodeToolTip");
-    propVec.push_back("view.tree.attributeToolTip");
-    prop_=new PropertyMapper(propVec,this);
-
-    VProperty *prop=0;
-    std::string propName;
-
-    //Init stylesheet related properties
-    propName="view.tree.background";
-    prop=prop_->find(propName);
-    UI_ASSERT(prop,"Could not find property=" + propName);
-    adjustBackground(prop->value().value<QColor>());
-
-    //Init stylesheet related properties
-    propName="view.tree.branchLineColour";
-    prop=prop_->find(propName);
-    UI_ASSERT(prop,"Could not find property=" + propName);
-    adjustBranchLineColour(prop->value().value<QColor>());
-
-    //Adjust tooltip
-    propName="view.tree.serverToolTip";
-    prop=prop_->find(propName);
-    UI_ASSERT(prop,"Could not find property=" + propName);
-    adjustServerToolTip(prop->value().toBool());
-
-    propName="view.tree.nodeToolTip";
-    prop=prop_->find(propName);
-    UI_ASSERT(prop,"Could not find property=" + propName);
-    adjustNodeToolTip(prop->value().toBool());
-
-    propName="view.tree.attributeToolTip";
-    prop=prop_->find(propName);
-    UI_ASSERT(prop,"Could not find property=" + propName);
-    adjustAttributeToolTip(prop->value().toBool());
-
-    inStartUp_=false;
-}
-
-CompactNodeView::~CompactNodeView()
-{
-    qDeleteAll(expandStates_);
-    delete actionHandler_;
-    delete prop_;
-}
-
-QWidget* CompactNodeView::realWidget()
-{
-    return this;
-}
-
-//Collects the selected list of indexes
-QModelIndexList CompactNodeView::selectedList()
-{
-    QModelIndexList lst;
-    Q_FOREACH(QModelIndex idx,selectedIndexes())
-        if(idx.column() == 0)
-            lst << idx;
-    return lst;
-}
-
-// reimplement virtual function from CompactView - called when the selection is changed
-void CompactNodeView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
-{
-    QModelIndexList lst=selectedIndexes();
-    //When the selection was triggered from restoring (expanding) the nodes
-    //we do not want to broadcast it
-    if(lst.count() > 0 && !setCurrentFromExpand_)
-    {
-        VInfo_ptr info=model_->nodeInfo(lst.front());
-        if(info && !info->isEmpty())
-        {
-#ifdef _UI_COMPACTNODEVIEW_DEBUG
-            UiLog().dbg() << "CompactNodeView::selectionChanged --> emit=" << info->path();
-#endif
-            Q_EMIT selectionChanged(info);
-        }
-        lastSelection_=info;
-    }
-
-    CompactView::selectionChanged(selected, deselected);
-
-    //The model has to know about the selection in order to manage the
-    //nodes that are forced to be shown
-    model_->selectionChanged(lst);
-}
-
-VInfo_ptr CompactNodeView::currentSelection()
-{
-    QModelIndexList lst=selectedIndexes();
-    if(lst.count() > 0)
-    {
-        return model_->nodeInfo(lst.front());
-    }
-    return VInfo_ptr();
-}
-
-void CompactNodeView::setCurrentSelection(VInfo_ptr info)
-{
-    //While the current is being selected we do not allow
-    //another setCurrent call go through
-    if(!info || setCurrentIsRunning_)
-        return;
-
-    setCurrentIsRunning_=true;
-    QModelIndex idx=model_->infoToIndex(info);
-    if(idx.isValid())
-    {
-#ifdef _UI_COMPACTNODEVIEW_DEBUG
-        UiLog().dbg() << "CompactNodeView::setCurrentSelection --> " << info->path();
-#endif
-        setCurrentIndex(idx);
-    }
-    setCurrentIsRunning_=false;
-}
-
-
-void CompactNodeView::setCurrentSelectionFromExpand(VInfo_ptr info)
-{
-    if(!info || setCurrentFromExpand_)
-        return;
-
-#ifdef _UI_COMPACTNODEVIEW_DEBUG
-        UiLog().dbg() << "CompactNodeView::setCurrentSelectionFromExpand --> " << info->path();
-#endif
-
-    setCurrentFromExpand_=true;
-    setCurrentSelection(info);
-    setCurrentFromExpand_=false;
-}
-
-void CompactNodeView::selectFirstServer()
-{
-    QModelIndex idx=model_->index(0,0);
-    if(idx.isValid())
-    {
-        setCurrentIndex(idx);
-        VInfo_ptr info=model_->nodeInfo(idx);
-        Q_EMIT selectionChanged(info);
-    }
-}
-
-void CompactNodeView::slotContextMenu(const QPoint &position)
-{
-    QModelIndexList lst=selectedList();
-    //QModelIndex index=indexAt(position);
-    QPoint scrollOffset(horizontalScrollBar()->value(),verticalScrollBar()->value());
-
-    handleContextMenu(indexAt(position),lst,mapToGlobal(position),position+scrollOffset,this);
-}
-
-
-void CompactNodeView::handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget)
-{
-    //Node actions
-    if(indexClicked.isValid() && indexClicked.column() == 0)   //indexLst[0].isValid() && indexLst[0].column() == 0)
-    {
-        //qDebug() << "context menu" << indexClicked;
-
-        std::vector<VInfo_ptr> nodeLst;
-        for(int i=0; i < indexLst.count(); i++)
-        {
-            VInfo_ptr info=model_->nodeInfo(indexLst[i]);
-            if(info && !info->isEmpty())
-                nodeLst.push_back(info);
-        }
-
-        actionHandler_->contextMenu(nodeLst,globalPos);
-    }
-
-    //Desktop actions
-    else
-    {
-    }
-}
-
-void CompactNodeView::slotDoubleClickItem(const QModelIndex& idx)
-{
-    VInfo_ptr info=model_->nodeInfo(idx);
-    if(info && info->isAttribute())
-    {
-        slotViewCommand(info,"edit");
-    }
-}
-
-void CompactNodeView::slotViewCommand(VInfo_ptr info,QString cmd)
-{
-    if(cmd == "expand")
-    {
-        QModelIndex idx=model_->infoToIndex(info);
-        if(idx.isValid())
-        {
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
-            QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
-#endif
-#ifdef _UI_COMPACTNODEVIEW_DEBUG
-            QTime t;
-            t.start();
-#endif
-            expandAll(idx);
-#ifdef _UI_COMPACTNODEVIEW_DEBUG
-            UiLog().dbg() << "expandAll time=" << t.elapsed()/1000. << "s";
-#endif
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
-            QGuiApplication::restoreOverrideCursor();
-#endif
-
-        }
-    }
-    else if(cmd == "collapse")
-    {
-        QModelIndex idx=model_->infoToIndex(info);
-        if(idx.isValid())
-        {
-            collapseAll(idx);
-        }
-    }
-
-    else if(cmd ==  "edit")
-    {
-        if(info && info->isAttribute())
-        {
-            AttributeEditor::edit(info,this);
-        }
-    }
-
-    /*if(cmd == "set_as_root")
-    {
-        model_->setRootNode(nodeLst.at(0)->node());
-        expandAll();
-    }*/
-}
-
-void CompactNodeView::reload()
-{
-    //model_->reload();
-    //expandAll();
-}
-
-void CompactNodeView::rerender()
-{
-    if(needItemsLayout_)
-    {
-        doItemsLayout();
-        needItemsLayout_=false;
-    }
-    else
-    {
-        viewport()->update();
-    }
-}
-
-void CompactNodeView::slotRerender()
-{
-    rerender();
-}
-
-void CompactNodeView::slotRepaint(Animation* an)
-{
-    if(!an)
-        return;
-
-    Q_FOREACH(VNode* n,an->targets())
-    {
-        update(model_->nodeToIndex(n));
-    }
-}
-
-void CompactNodeView::slotSizeHintChangedGlobal()
-{
-    needItemsLayout_=true;
-}
-
-
-//====================================================
-// Expand state management
-//====================================================
-
-#if 0
-void CompactNodeView::expandAll(const QModelIndex& idx)
-{
-    expand(idx);
-
-    for(int i=0; i < model_->rowCount(idx); i++)
-    {
-        QModelIndex chIdx=model_->index(i, 0, idx);
-        expandAll(chIdx);
-    }
-}
-#endif
-
-#if 0
-void CompactNodeView::collapseAll(const QModelIndex& idx)
-{
-    collapse(idx);
-
-    for(int i=0; i < model_->rowCount(idx); i++)
-    {
-        QModelIndex chIdx=model_->index(i, 0, idx);
-        collapseAll(chIdx);
-    }
-}
-#endif
-
-void CompactNodeView::expandTo(const QModelIndex& idxTo)
-{
-    QModelIndex idx=model_->parent(idxTo);
-    QModelIndexList lst;
-
-    //qDebug() << idxTo << idx;
-
-    while(idx.isValid())
-    {
-        lst.push_front(idx);
-        idx=idx.parent();
-    }
-
-    //qDebug() << lst;
-
-    Q_FOREACH(QModelIndex d,lst)
-    {
-        expand(d);
-        //qDebug() << "expand" << d << isExpanded(d);
-    }
-}
-
-//Save all
-void CompactNodeView::slotSaveExpand()
-{
-    for(int i=0; i < model_->rowCount(); i++)
-    {
-        QModelIndex serverIdx=model_->index(i, 0);
-        VTreeServer* ts=model_->indexToServer(serverIdx);
-        Q_ASSERT(ts);
-
-        CompactViewExpandState* es=new CompactViewExpandState(this,model_);
-        expandStates_ << es;
-        es->save(ts->tree());
-    }
-}
-
-void CompactNodeView::slotRestoreExpand()
-{
-    Q_FOREACH(CompactViewExpandState* es,expandStates_)
-    {
-        if(es->root())
-        {
-            VTreeServer* ts=model_->nameToServer(es->root()->name_);
-            if(ts)
-            {
-                QModelIndex idx=model_->nodeToIndex(ts->tree());
-                if(idx.isValid())
-                {
-                    collapse(idx);
-                    es->collectExpanded(ts->tree(),expandedIndexes);
-                    expand(idx);
-                }
-            }
-        }
-    }
-
-    qDeleteAll(expandStates_);
-    expandStates_.clear();
-    regainSelectionFromExpand();
-}
-
-//Save the expand state for the given node (it can be a server as well)
-void CompactNodeView::slotSaveExpand(const VTreeNode* node)
-{
-    CompactViewExpandState* es=new CompactViewExpandState(this,model_);
-    expandStates_ << es;
-    es->save(node);
-}
-
-//Restore the expand state for the given node (it can be a server as well)
-void CompactNodeView::slotRestoreExpand(const VTreeNode* node)
-{
-    for(int i=0; i < expandStates_.count(); i++)
-    {
-        CompactViewExpandState* es=expandStates_[i];
-        {
-            if(es->rootSameAs(node->vnode()->strName()))
-            {
-                //es->restore(node);
-                QModelIndex idx=model_->nodeToIndex(node);
-                if(idx.isValid())
-                {
-                    collapse(idx);
-                    es->collectExpanded(node,expandedIndexes);
-                    expand(idx);
-                }
-                expandStates_.remove(i);
-                delete es;
-                break;
-            }
-        }
-    }
-
-    regainSelectionFromExpand();
-}
-
-void CompactNodeView::regainSelectionFromExpand()
-{
-    VInfo_ptr s=currentSelection();
-    if(!s)
-    {
-        if(lastSelection_)
-        {
-            lastSelection_->regainData();
-            if(!lastSelection_->hasData())
-            {
-                lastSelection_.reset();
-            }
-            else
-            {
-                setCurrentSelectionFromExpand(lastSelection_);
-            }
-        }
-    }
-}
-
-//==============================================
-// Property handling
-//==============================================
-
-void CompactNodeView::adjustBackground(QColor col)
-{
-    if(col.isValid())
-    {        
-        QPalette p=viewport()->palette();
-        p.setColor(QPalette::Window,col);
-        viewport()->setPalette(p);
-
-        //When we set the palette on startup something resets the palette
-        //before the first paint event happens. So we set the expected bg colour
-        //so that the view should know what bg colour it should use.
-        if(inStartUp_)
-            setExpectedBg(col);
-    }
-}
-
-void CompactNodeView::adjustBranchLineColour(QColor col)
-{
-    setConnectorColour(col);
-}
-
-void CompactNodeView::adjustServerToolTip(bool st)
-{
-    model_->setEnableServerToolTip(st);
-}
-
-void CompactNodeView::adjustNodeToolTip(bool st)
-{
-    model_->setEnableNodeToolTip(st);
-}
-
-void CompactNodeView::adjustAttributeToolTip(bool st)
-{
-    model_->setEnableAttributeToolTip(st);
-}
-
-void CompactNodeView::notifyChange(VProperty* p)
-{   
-    if(p->path() == "view.tree.background")
-    {
-        adjustBackground(p->value().value<QColor>());
-    }
-    else if(p->path() == "view.tree.branchLineColour")
-    {
-        adjustBranchLineColour(p->value().value<QColor>());
-    }
-    else if(p->path() == "view.tree.serverToolTip")
-    {
-        adjustServerToolTip(p->value().toBool());
-    }
-    else if(p->path() == "view.tree.nodeToolTip")
-    {
-        adjustNodeToolTip(p->value().toBool());
-    }
-    else if(p->path() == "view.tree.attributeToolTip")
-    {
-        adjustAttributeToolTip(p->value().toBool());
-    }
-}
diff --git a/Viewer/src/CompactNodeView.hpp b/Viewer/src/CompactNodeView.hpp
deleted file mode 100644
index 5f3b6b8..0000000
--- a/Viewer/src/CompactNodeView.hpp
+++ /dev/null
@@ -1,103 +0,0 @@
-//============================================================================
-// Copyright 2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 COMPACTNODEVIEW_HPP
-#define COMPACTNODEVIEW_HPP
-
-#include "CompactView.hpp"
-#include "ExpandState.hpp"
-#include "NodeViewBase.hpp"
-#include "VInfo.hpp"
-#include "VProperty.hpp"
-
-#include <QMap>
-#include <QModelIndex>
-
-class ActionHandler;
-class Animation;
-class ExpandNode;
-//class ExpandState;
-class PropertyMapper;
-class VTreeNode;
-class QItemSelection;
-
-class CompactNodeView : public CompactView, public NodeViewBase, public VPropertyObserver
-{
-Q_OBJECT
-
-public:
-    explicit CompactNodeView(TreeNodeModel* model,NodeFilterDef* filterDef,QWidget *parent=0);
-    ~CompactNodeView();
-
-    void reload();
-    void rerender();
-    QWidget* realWidget();
-    VInfo_ptr currentSelection();
-    void setCurrentSelection(VInfo_ptr n);
-    void selectFirstServer();
-
-    void notifyChange(VProperty* p);
-
-    void readSettings(VSettings* vs) {}
-    void writeSettings(VSettings* vs) {}
-
-public Q_SLOTS:
-    void slotContextMenu(const QPoint &position);
-    void slotViewCommand(VInfo_ptr,QString);
-    void slotSaveExpand();
-    void slotRestoreExpand();
-    void slotSaveExpand(const VTreeNode* node);
-    void slotRestoreExpand(const VTreeNode* node);
-    void slotRepaint(Animation*);
-    void slotRerender();
-    void slotSizeHintChangedGlobal();
-
-protected Q_SLOTS:
-    void slotDoubleClickItem(const QModelIndex&);
-    void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
-
-Q_SIGNALS:
-    void selectionChanged(VInfo_ptr);
-    void infoPanelCommand(VInfo_ptr,QString);
-    void dashboardCommand(VInfo_ptr,QString);
-
-protected:
-    QModelIndexList selectedList();
-    void handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget);
-
-    void saveExpand(ExpandNode *parentExpand,const QModelIndex& idx);
-    void restoreExpand(ExpandNode *expand,const VNode* node);   
-    void expandTo(const QModelIndex& idxTo);
-    void setCurrentSelectionFromExpand(VInfo_ptr info);
-    void regainSelectionFromExpand();
-
-    void adjustBackground(QColor col);
-    void adjustBranchLineColour(QColor col);
-    void adjustServerToolTip(bool);
-    void adjustNodeToolTip(bool);
-    void adjustAttributeToolTip(bool);
-
-    ActionHandler* actionHandler_;
-    bool needItemsLayout_;
-    int defaultIndentation_;
-    PropertyMapper* prop_;
-    QMap<QString,QString> styleSheet_;
-    bool setCurrentIsRunning_;
-    bool setCurrentFromExpand_;
-    VInfo_ptr lastSelection_;
-
-    typedef ExpandState<CompactNodeView> CompactViewExpandState;
-    QVector<CompactViewExpandState*> expandStates_;
-    bool inStartUp_;
-};
-
-
-#endif // COMPACTNODEVIEW_HPP
-
diff --git a/Viewer/src/CompactNodeViewDelegate.cpp b/Viewer/src/CompactNodeViewDelegate.cpp
deleted file mode 100644
index 78bdbde..0000000
--- a/Viewer/src/CompactNodeViewDelegate.cpp
+++ /dev/null
@@ -1,298 +0,0 @@
-//============================================================================
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 "CompactNodeViewDelegate.hpp"
-
-#include <QApplication>
-#include <QDebug>
-#include <QImageReader>
-#include <QLinearGradient>
-#include <QPainter>
-
-#include "AbstractNodeModel.hpp"
-#include "Animation.hpp"
-#include "IconProvider.hpp"
-#include "PropertyMapper.hpp"
-#include "RectMetrics.hpp"
-#include "ServerHandler.hpp"
-#include "TreeNodeModel.hpp"
-#include "UiLog.hpp"
-
-class CompactNodeDelegateBox : public NodeDelegateBox
-{
-public:
-
-    CompactNodeDelegateBox() : textTopCorrection(0), textBottomCorrection(0)
-     {
-         topMargin=2;
-         bottomMargin=2;
-         leftMargin=1;
-         rightMargin=2;
-         topPadding=0;
-         bottomPadding=0;
-         leftPadding=2;
-         rightPadding=2;
-     }
-
-     int realFontHeight;
-     int textTopCorrection;
-     int textBottomCorrection;
-
-     void adjust(const QFont& f)
-     {
-         FontMetrics fm(f);
-         realFontHeight=fm.realHeight();
-         textTopCorrection=fm.topPaddingForCentre();
-         textBottomCorrection=fm.bottomPaddingForCentre();
-         fontHeight=fm.height();
-
-         if(textTopCorrection > 1)
-         {
-             textTopCorrection-=2;
-             realFontHeight+=2;
-         }
-
-         height=realFontHeight+topPadding+bottomPadding;
-         fullHeight=height+topMargin+bottomMargin;
-         sizeHintCache=QSize(100,fullHeight);
-         spacing=fm.width('A')*3/4;
-
-         int h=static_cast<int>(static_cast<float>(fm.height())*0.7);
-         iconSize=h;
-         if(iconSize % 2 == 1)
-             iconSize+=1;
-
-         iconGap=1;
-         if(iconSize > 16)
-             iconGap=2;
-
-         iconPreGap=fm.width('A')/2;
-     }
-
-     QRect adjustTextRect(const QRect& rIn) const
-     {
-         //Q_ASSERT(rIn.height() == fontHeight);
-         QRect r=rIn;
-         r.setY(r.y()-textTopCorrection);
-         r.setHeight(fontHeight);
-         return r;
-     }
-
-     QRect adjustSelectionRect(const QRect& optRect) const {
-         QRect r=optRect;
-         return r;
-     }
-};
-
-class CompactAttrDelegateBox : public AttrDelegateBox
-{
-public:
-    CompactAttrDelegateBox() : textTopCorrection(0), textBottomCorrection(0)
-     {
-         topMargin=2;
-         bottomMargin=2;
-         leftMargin=1;
-         rightMargin=2;
-         topPadding=0;
-         bottomPadding=0;
-         leftPadding=1;
-         rightPadding=2;  
-     }
-
-     int realFontHeight;
-     int textTopCorrection;
-     int textBottomCorrection;
-
-     void adjust(const QFont& f)
-     {
-         FontMetrics fm(f);
-         realFontHeight=fm.realHeight();
-         textTopCorrection=fm.topPaddingForCentre();
-         textBottomCorrection=fm.bottomPaddingForCentre();
-         fontHeight=fm.height();
-
-         height=realFontHeight+topPadding+bottomPadding;
-         fullHeight=height+topMargin+bottomMargin;
-         sizeHintCache=QSize(100,fullHeight);
-         spacing=fm.width('A')*3/4;
-     }
-
-     QRect adjustTextRect(const QRect& rIn) const
-     {
-         QRect r=rIn;
-         r.setY(r.y()-textTopCorrection+1);
-         r.setHeight(fontHeight);
-         return r;
-     }
-
-     QRect adjustTextBgRect(const QRect& rIn) const
-     {
-         QRect r=rIn;
-         return r.adjusted(0,-1,0,1);
-     }
-
-     QRect adjustSelectionRect(const QRect& optRect) const {
-         QRect r=optRect;
-         return r.adjusted(0,-selectRm.topOffset(),0,-selectRm.bottomOffset());
-     }
-
-     QRect adjustSelectionRectNonOpt(const QRect& optRect) const {
-         return adjustSelectionRect(optRect);
-     }
-};
-
-CompactNodeViewDelegate::CompactNodeViewDelegate(TreeNodeModel* model,QWidget *parent) :
-    TreeNodeViewDelegateBase(model,parent)
-{
-    nodeBox_=new CompactNodeDelegateBox;
-    attrBox_=new CompactAttrDelegateBox;
-
-    nodeBox_->adjust(font_);
-    attrBox_->adjust(attrFont_);
-
-    updateSettings();
-}
-
-CompactNodeViewDelegate::~CompactNodeViewDelegate()
-{
-}
-
-bool CompactNodeViewDelegate::isSingleHeight(int h) const
-{
-    return (h==nodeBox_->fullHeight || h == attrBox_->fullHeight);
-}
-
-QSize CompactNodeViewDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex & index ) const
-{
-#if 0
-    //QSize size=QStyledItemDelegate::sizeHint(option,index);
-    //QSize size(100,fontHeight_+8);
-
-    int attLineNum=0;
-    if((attLineNum=index.data(AbstractNodeModel::AttributeLineRole).toInt()) > 0)
-    {
-        if(attLineNum==1)
-            return attrBox_->sizeHintCache;
-        else
-        {
-            QFontMetrics fm(attrFont_);
-            QStringList lst;
-            for(int i=0; i < attLineNum; i++)
-                lst << "1";
-
-            return QSize(100,fm.size(0,lst.join(QString('\n'))).height()+6);
-        }
-    }
-
-    return nodeBox_->sizeHintCache;
-#endif
-
-    return nodeBox_->sizeHintCache;
-}
-
-//This has to be extremely fast
-void CompactNodeViewDelegate::sizeHint(const QModelIndex& index,int& w,int& h) const
-{
-    QVariant tVar=index.data(Qt::DisplayRole);
-
-    h=nodeBox_->fullHeight;
-
-    //For nodes we compute the exact size of visual rect
-    if(tVar.type() == QVariant::String)
-    {
-        QString text=index.data(Qt::DisplayRole).toString();
-        if(index.data(AbstractNodeModel::ServerRole).toInt() ==0)
-        {
-            widthHintServer(index,w,text);
-        }
-        else
-        {
-            w=nodeWidth(index,text);
-        }
-    }
-    //For attributes we do not need the exact width since they do not have children so
-    //there is nothing on their right in the view. We compute their proper size when
-    //they are first rendered. However the exact height must be known at this stage!
-    else if(tVar.type() == QVariant::StringList)
-    {
-        //Each attribute has this height except the multiline labels
-        h=attrBox_->fullHeight;
-
-        //It is a big enough hint for the width.
-        w=300;
-
-        //For multiline labels we need to cimpute the height
-        int attLineNum=0;
-        if((attLineNum=index.data(AbstractNodeModel::AttributeLineRole).toInt()) > 1)
-        {
-            h=labelHeight(attLineNum);
-        }
-    }
-}
-
-int CompactNodeViewDelegate::paintItem(QPainter *painter,const QStyleOptionViewItem &option,
-                   const QModelIndex& index) const
-{
-    int width=0;
-
-    //Background
-    QStyleOptionViewItem vopt(option);
-    initStyleOption(&vopt, index);
-
-    //Save painter state
-    painter->save();
-
-    if(index.data(AbstractNodeModel::ConnectionRole).toInt() == 0)
-    {
-        QRect fullRect=QRect(0,vopt.rect.y(),painter->device()->width(),vopt.rect.height());
-        painter->fillRect(fullRect,lostConnectBgBrush_);
-        QRect bandRect=QRect(0,vopt.rect.y(),5,vopt.rect.height());
-        painter->fillRect(bandRect,lostConnectBandBrush_);
-    }
-
-    QVariant tVar=index.data(Qt::DisplayRole);
-    painter->setFont(font_);
-
-    if(tVar.type() == QVariant::String)
-    {
-        QString text=index.data(Qt::DisplayRole).toString();
-        if(index.data(AbstractNodeModel::ServerRole).toInt() ==0)
-        {
-            width=renderServer(painter,index,vopt,text);
-        }
-        else
-        {
-            width=renderNode(painter,index,vopt,text);
-        }
-    }
-    //Render attributes
-    else if(tVar.type() == QVariant::StringList)
-    {
-        QStringList lst=tVar.toStringList();
-        if(lst.count() > 0)
-        {
-            QMap<QString,AttributeRendererProc>::const_iterator it=attrRenderers_.find(lst.at(0));
-            if(it != attrRenderers_.end())
-            {
-                AttributeRendererProc a=it.value();
-                width=(this->*a)(painter,lst,vopt);
-            }
-            //if(width==0)
-            //    width=300;
-        }
-
-    }
-
-    painter->restore();
-
-    return width;
-
-    //else
-    //	QStyledItemDelegate::paint(painter,option,index);
-}
diff --git a/Viewer/src/CompactView.cpp b/Viewer/src/CompactView.cpp
index c8705ac..b9b28aa 100644
--- a/Viewer/src/CompactView.cpp
+++ b/Viewer/src/CompactView.cpp
@@ -12,346 +12,37 @@
 
 #include "ExpandState.hpp"
 #include "TreeNodeModel.hpp"
-#include "CompactNodeViewDelegate.hpp"
+#include "TreeNodeViewDelegate.hpp"
 #include "UIDebug.hpp"
 #include "UiLog.hpp"
 
 #include <QtAlgorithms>
 #include <QApplication>
 #include <QDebug>
-#include <QItemSelectionRange>
 #include <QPainter>
 #include <QMouseEvent>
 #include <QScrollBar>
-#include <QStack>
 #include <QStyledItemDelegate>
 #include <QTimerEvent>
-#include <QToolTip>
 
 //#define _UI_COMPACTVIEW_DEBUG
 
 CompactView::CompactView(TreeNodeModel* model,QWidget* parent) :
-    QAbstractScrollArea(parent),
-    model_(model),
-    verticalScrollMode_(ScrollPerItem),
-    rowCount_(0),
-    maxRowWidth_(0),
-    lastViewedItem_(0),
-    topMargin_(4),
-    leftMargin_(4),
-    itemGap_(12),
-    connectorGap_(1),
-    expandConnectorLenght_(20),
-    noSelectionOnMousePress_(false),
-    connectorColour_(Qt::black)
+    AbstractNodeView(model,parent)
 {
-    delegate_=new CompactNodeViewDelegate(model_,this);
+    //This is needed for making the context menu work
+    setProperty("view","tree");
 
-    itemDelegate_=new QStyledItemDelegate(this);
-
-    expandConnectorLenght_=itemGap_-2*connectorGap_;
-
-    viewport()->setBackgroundRole(QPalette::Window);
-
-    //We attach the model.
-    attachModel();
-}
-
-CompactView::~CompactView()
-{
-
-}
-
-//Connect the models signal to the view
-void CompactView::attachModel()
-{
-    //Standard signals from the model
-    connect(model_,SIGNAL(modelReset()),
-        this,SLOT(reset()));
-
-    connect(model_,SIGNAL(rowsInserted(QModelIndex,int,int)),
-              this, SLOT(rowsInserted(QModelIndex,int,int)));
-
-    connect(model_,SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-            this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int)));
-
-    connect(model_,SIGNAL(rowsRemoved(QModelIndex,int,int)),
-            this, SLOT(rowsRemoved(QModelIndex,int,int)));
-
-    connect(model_,SIGNAL(dataChanged(const QModelIndex&,const QModelIndex&)),
-        this,SLOT(dataChanged(const QModelIndex&,const QModelIndex&)));
-
-    //The selection model
-    selectionModel_ = new QItemSelectionModel(model_, this);
-    connect(model_, SIGNAL(destroyed()), selectionModel_, SLOT(deleteLater()));
-
-    connect(selectionModel_, SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
-            this, SLOT(selectionChanged(QItemSelection,QItemSelection)));
-
-    connect(selectionModel_, SIGNAL(currentChanged(QModelIndex,QModelIndex)),
-            this, SLOT(currentChanged(QModelIndex,QModelIndex)));
-
-    //We need to call it to be sure that the view show the actual state of the model!!!
+    //we cannot call it from the constructor of the base class
+    //because it calls a pure virtual method
     reset();
 }
 
-void CompactView::mousePressEvent(QMouseEvent* event)
-{
-    QPoint pos = event->pos();
-    QPersistentModelIndex index = indexAt(pos);
-    pressedIndex_ = index;
-
-    //Get the selection flags
-    QItemSelectionModel::SelectionFlags command = selectionCommand(index, event);
-
-    noSelectionOnMousePress_ = command == QItemSelectionModel::NoUpdate || !index.isValid();
-
-#ifdef _UI_COMPACTVIEW_DEBUG
-    UiLog().dbg() << "CompactView::mousePressEvent --> current=" << currentIndex().data().toString() <<
-                     " pressed=" << pressedIndex_.data().toString() <<
-                     " pos=" << pos << " pressedRef=" << pressedRefIndex_.data().toString();
-#endif
-
-    if((command & QItemSelectionModel::Current) == 0)
-        pressedRefIndex_ = index;
-    else if(!pressedRefIndex_.isValid())
-        pressedRefIndex_ = currentIndex();
-
-    QPoint pressedRefPosition=visualRect(pressedRefIndex_).center();
-
-
-#ifdef _UI_COMPACTVIEW_DEBUG
-    UiLog().dbg() << " pressedRefPosition=" << pressedRefPosition << " visrect=" << visualRect(currentIndex()) <<
-                     " center=" << visualRect(currentIndex()).center() << " pressedRef=" << indexAt(pressedRefPosition).data().toString() <<
-                     " pressedRef=" << pressedRefIndex_.data().toString();
-#endif
-
-    if(index.isValid())
-    {
-        selectionModel_->setCurrentIndex(index, QItemSelectionModel::NoUpdate);               
-        QPoint p1=pressedRefPosition;
-        QRect rect(p1,QSize(pos.x()-p1.x(),pos.y()-p1.y()));
-#ifdef _UI_COMPACTVIEW_DEBUG
-        UiLog().dbg() << " rect=" << rect << " p1=" << p1 << " p2=" << pos ;
-#endif
-        setSelection(rect, command);
-    }
-    else
-    {
-        //Forces a finalize even if mouse is pressed, but not on a item
-        selectionModel_->select(QModelIndex(), QItemSelectionModel::Select);
-    }
-
-    if(event->button() == Qt::MidButton)
-    {
-        int viewItemIndex=itemAtCoordinate(event->pos());
-        if(viewItemIndex != -1 && viewItems_[viewItemIndex].hasChildren)
-        {
-#ifdef _UI_COMPACTVIEW_DEBUG
-            UiLog().dbg() << " midbutton index=" << viewItemIndex << " name=" <<
-                               viewItems_[viewItemIndex].index.data().toString();
-#endif
-            if(viewItems_[viewItemIndex].expanded)
-            {
-                collapse(viewItemIndex);
-                updateRowCount();
-                updateScrollBars();
-                viewport()->update();
-            }
-            else
-            {
-                expand(viewItemIndex);
-            }            
-        }
-    }
-}
-
-void CompactView::mouseReleaseEvent(QMouseEvent *event)
-{
-    QPoint pos = event->pos();
-    QPersistentModelIndex index = indexAt(pos);
-
-    if(selectionModel_ && noSelectionOnMousePress_)
-    {
-        noSelectionOnMousePress_ = false;
-        selectionModel_->select(index, selectionCommand(index, event));
-    }
-}
-
-void CompactView::mouseDoubleClickEvent(QMouseEvent *event)
-{
-    if(event->button() == Qt::LeftButton)
-    {
-        int viewItemIndex=itemAtCoordinate(event->pos());
-        if(viewItemIndex != -1)
-        {
-            if(viewItems_[viewItemIndex].hasChildren)
-            {
-#ifdef _UI_COMPACTVIEW_DEBUG
-                UiLog().dbg() << "CompactNodeView::mousePressEvent " << viewItemIndex << " name=" <<
-                               viewItems_[viewItemIndex].index.data().toString();
-#endif
-                if(viewItems_[viewItemIndex].expanded)
-                {
-                    collapse(viewItemIndex);
-                }
-                else
-                {
-                    expand(viewItemIndex);
-                }
-                updateRowCount();
-                updateScrollBars();
-                viewport()->update();
-            }
-            else
-            {
-                Q_EMIT doubleClicked(viewItems_[viewItemIndex].index);
-            }
-       }
-    }
-}
-
-void CompactView::keyPressEvent(QKeyEvent *event)
-{
-    QModelIndex current = currentIndex();
-
-    if (current.isValid())
-    {
-        switch(event->key())
-        {
-        case Qt::Key_Plus:
-            expand(current);
-            break;
-        case Qt::Key_Minus:
-            collapse(current);
-            break;
-        }
-    }
-
-    QAbstractScrollArea::keyPressEvent(event);
-}
-
-bool CompactView::viewportEvent(QEvent *event)
-{
-    if(event->type() == QEvent::ToolTip)
-    {
-        QHelpEvent *he = static_cast<QHelpEvent*>(event);
-        const QModelIndex index = indexAt(he->pos());
-
-        //see qbatractitemdelegate::helpEvent()
-        QVariant tooltip = index.data(Qt::ToolTipRole);
-        if(tooltip.canConvert<QString>())
-        {
-              QToolTip::showText(he->globalPos(),tooltip.toString(),this);
-              return true;
-        }
-        return false;
-    }
-    return QAbstractScrollArea::viewportEvent(event);
-}
-
-void CompactView::timerEvent(QTimerEvent *event)
-{
-    if(event->timerId() == delayedWidth_.timerId())
-    {
-        updateScrollBars();
-        viewport()->update();
-        delayedWidth_.stop();
-    }
-}
-
-void CompactView::reset()
-{
-    viewItems_.clear();
-    rowCount_=0;
-    maxRowWidth_=0;
-    expandedIndexes.clear();
-    pressedRefIndex_=QPersistentModelIndex(QModelIndex());
-    //currentIndexSet_ = false;
-    if(selectionModel_)
-        selectionModel_->reset();
-
-    layout(-1,false,false,false);
-    updateRowCount();
-    updateScrollBars();
-}
-
-/*
- Informs the view that the rows from the start row to the end row
- inclusive have been inserted into the parent model item.
-*/
-void CompactView::rowsInserted(const QModelIndex& parent,int start,int end)
-{
-    const int parentItem = viewIndex(parent);
-
-    //If the item is expanded we need to relayout the whole tree
-    if(((parentItem != -1) && viewItems_[parentItem].expanded) || (parent == root_))
-    {
-        doItemsLayout();
-    }
-
-    //the parent just went from 0 children to more. update to re-paint the decoration
-    else if(parentItem != -1 && (model_->rowCount(parent) == end - start + 1))
-    {
-        viewItems_[parentItem].hasChildren = true;
-        viewport()->update();
-    }
-}
-
-/*
-  Informs the view that the rows from the start row to the  end row
-  inclusive are about to removed from the given parent model item.
-*/
-void CompactView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
-{
-    //TODO: the selection has to be adjusted!!!
-    //QAbstractItemView::rowsAboutToBeRemoved(parent, start, end);
-
-    //A safety measure
-    viewItems_.clear();
-}
-
-/*
-    Informs the view that the rows from the start row to the  end row
-    inclusive have been removed from the given  parent model item.
-*/
-void CompactView::rowsRemoved(const QModelIndex &parent, int start, int end)
-{
-    doItemsLayout(true);
-}
-
-void CompactView::doItemsLayout(bool hasRemovedItems)
+CompactView::~CompactView()
 {
-    if(hasRemovedItems)
-    {
-        //clean the QSet that may contains old (and thus invalid) indexes
-        QSet<QPersistentModelIndex>::iterator it = expandedIndexes.begin();
-        while (it != expandedIndexes.constEnd())
-        {
-            if (!it->isValid())
-                it = expandedIndexes.erase(it);
-            else
-                ++it;
-        }
-        //TODO: do we need to clear the selectionmodel?
-    }
-
-    viewItems_.clear(); // prepare for new layout
-    rowCount_=0;
-    maxRowWidth_=0;
-    pressedRefIndex_=QPersistentModelIndex(QModelIndex());
 
-    QModelIndex parent = root_;
-    if(model_->hasChildren(parent))
-    {
-        layout(-1,false,false,false);
-    }
-    updateRowCount();
-    updateScrollBars();
-    viewport()->update();
 }
 
-
 //Creates and initialize the viewItem structure of the children of the element
 // parentId: the items whose children are to be expanded
 // recursiveExpanding: all the children will be expanded
@@ -408,7 +99,7 @@ void CompactView::layout(int parentId, bool recursiveExpanding,bool afterIsUnini
             }
             else
             {
-                insertViewItems(parentId + 1, count, CompactViewItem());
+                insertViewItems(parentId + 1, count, TreeNodeViewItem());
             }
         }
         //ExpandAll from the root
@@ -424,7 +115,7 @@ void CompactView::layout(int parentId, bool recursiveExpanding,bool afterIsUnini
     int last = 0;
     int children = 0;
     int level=(parentId >=0?viewItems_[parentId].level+1:0);
-    CompactViewItem *item=0;
+    TreeNodeViewItem *item=0;
 
     std::vector<int> itemWidthVec;
     std::vector<int> itemHeightVec;
@@ -536,18 +227,12 @@ void CompactView::layout(int parentId, bool recursiveExpanding,bool afterIsUnini
     }
 }
 
-void CompactView::paintEvent(QPaintEvent *event)
-{
-    QPainter painter(viewport());
-    paint(&painter,event->region());
-}
-
 //Paint the rows intersecting with the given region
 void CompactView::paint(QPainter *painter,const QRegion& region)
 {
     //Even though the viewport palette is set correctly at the
     //beginning something sets it to another value. Here we try
-    //to detect it and correct the palette with right colour.
+    //to detect it and correct the palette with the right colour.
     if(expectedBg_.isValid())
     {
         QPalette p=viewport()->palette();
@@ -563,7 +248,7 @@ void CompactView::paint(QPainter *painter,const QRegion& region)
 
 #ifdef _UI_COMPACTVIEW_DEBUG
     UiLog().dbg() << "CompactView::paint -->";
-    //UiLog().dbg() << "sizeof(CompactViewItem)=" << sizeof(CompactViewItem);
+    //UiLog().dbg() << "sizeof(TreeNodeViewItem)=" << sizeof(TreeNodeViewItem);
     //UiLog().dbg() << "region=" << region;
 #endif
 
@@ -611,11 +296,11 @@ void CompactView::paint(QPainter *painter,const QRegion& region)
         std::vector<int> indentVec(1000,0);
         if(firstVisible >0)
         {
-            CompactViewItem* item=&viewItems_[firstVisible];
+            TreeNodeViewItem* item=&viewItems_[firstVisible];
             int level=item->level;
             while(item->parentItem >= 0 && level >0)
             {
-                CompactViewItem* pt=&viewItems_[item->parentItem];
+                TreeNodeViewItem* pt=&viewItems_[item->parentItem];
                 if(item->hasMoreSiblings)
                 {
                     indentVec[item->level]=connectorPos(item,pt);
@@ -677,7 +362,7 @@ void CompactView::paint(QPainter *painter,const QRegion& region)
     }
 }
 
-//Draw a whole row staring at item start.
+//Draw a whole row starting at item "start".
 void CompactView::drawRow(QPainter* painter,int start,int xOffset,int& yp,int& itemsInRow,std::vector<int>& indentVec)
 {
     itemsInRow=0;
@@ -697,7 +382,7 @@ void CompactView::drawRow(QPainter* painter,int start,int xOffset,int& yp,int& i
     //We iterate through the items in the row
     for(int i=start; i < itemsCount && !leaf; ++i )
     {
-        CompactViewItem* item=&(viewItems_[i]);
+        TreeNodeViewItem* item=&(viewItems_[i]);
 #ifdef _UI_COMPACTVIEW_DEBUG
         UiLog().dbg() << "  item=" << i << " " << item->index.data().toString();
 #endif
@@ -745,15 +430,43 @@ void CompactView::drawRow(QPainter* painter,int start,int xOffset,int& yp,int& i
 //          UiLog().dbg() << "  optRect=" << opt.rect << " visRect=" << vr;
 //#endif
 
-
             //Draw the item with the delegate
-            int paintedWidth=delegate_->paintItem(painter,opt,item->index);
+            QSize paintedSize;
+            delegate_->paint(painter,opt,item->index,paintedSize);
+
+            //we have to know if the item width/height is the same that we expected.
+            //This can happen when:
+            // -we set a fixed initial width for the item (e.g. for an attribute)
+            //  and now we got the real width
+            // -the number of icons or additional extra information
+            //  changed for a node (so the width changed)
+            // -the number of lines changed in a multiline label (so the height changed)
+            bool wChanged=paintedSize.width() != item->width;
+            bool hChanged=paintedSize.height() != item->height;
+
+            if(wChanged || hChanged)
+            {
+                //set new size
+                item->width=paintedSize.width();
+                item->height=paintedSize.height();
 
-            //we have to know if the item width is the same that we exepcted
-            if(paintedWidth != item->width)
+                if(item->right() > maxRowWidth_)
+                {
+                    maxRowWidth_=item->right();
+                    doDelayedWidthAdjustment();
+                }
+                else if(hChanged)
+                {
+                    doDelayedWidthAdjustment();
+                }
+            }
+
+            //The width changed
+
+            if(wChanged)
             {
                 bool sameAsWidest=(item->width == item->widestInSiblings);
-                item->width=paintedWidth;
+                item->width=paintedSize.width();
 
                 //servers
                 if(item->parentItem ==-1)
@@ -765,13 +478,13 @@ void CompactView::drawRow(QPainter* painter,int start,int xOffset,int& yp,int& i
                 else if(model_->isNode(item->index))
                 {
                     //widestInSiblings has to be adjusted
-                    if(sameAsWidest || paintedWidth  > item->widestInSiblings)
+                    if(sameAsWidest || paintedSize.width()  > static_cast<int>(item->widestInSiblings))
                     {
                         adjustWidthInParent(i);
                         doDelayedWidthAdjustment();
                     }
                     //we just need to update the item
-                    else if( paintedWidth < item->widestInSiblings)
+                    else if( paintedSize.width() < static_cast<int>(item->widestInSiblings))
                     {
                         doDelayedWidthAdjustment();
                     }
@@ -786,6 +499,13 @@ void CompactView::drawRow(QPainter* painter,int start,int xOffset,int& yp,int& i
                     }
                 }
             }
+            //the height changed (can only be a multiline label)
+            if(hChanged)
+            {
+                //set new size
+                item->height=paintedSize.height();
+                doDelayedWidthAdjustment();
+            }
 
             //QRect rr=opt.rect;
             //rr.setWidth(item->width);
@@ -800,7 +520,7 @@ void CompactView::drawRow(QPainter* painter,int start,int xOffset,int& yp,int& i
             if(item->parentItem >=0)
             {
                 //The parent item. It is always a node.
-                CompactViewItem* pt=&(viewItems_[item->parentItem]);
+                TreeNodeViewItem* pt=&(viewItems_[item->parentItem]);
 
                 //The horizontal line connecting the item to its parent
                 int lineX1=pt->right()+connectorGap_;
@@ -871,7 +591,7 @@ void CompactView::drawRow(QPainter* painter,int start,int xOffset,int& yp,int& i
             //Draw the vertical connector lines for all the levels
             //preceding the first level in the row!           
             painter->setPen(connectorColour_);
-            for(size_t j=0; j < firstLevel; j++)
+            for(int j=0; j < firstLevel; j++)
             {
                 int xp=indentVec[j];
                 if(xp != 0)    
@@ -970,47 +690,11 @@ void CompactView::adjustWidthInParent(int start)
 
 }
 
-int CompactView::connectorPos(CompactViewItem* item, CompactViewItem* parent) const
+int CompactView::connectorPos(TreeNodeViewItem* item, TreeNodeViewItem* parent) const
 {
     return (parent->right()+item->x)/2;
 }
 
-//Updates the area occupied by the given index.
-void CompactView::update(const QModelIndex &index)
-{
-    if (index.isValid())
-    {
-        const QRect rect = visualRect(index);
-        //this test is important for peformance reasons
-        //For example in dataChanged if we simply update all the cells without checking
-        //it can be a major bottleneck to update rects that aren't even part of the viewport
-        if(viewport()->rect().intersects(rect))
-        {
-#ifdef _UI_COMPACTVIEW_DEBUG
-            UiLog().dbg() << "update -->" << index.data().toString() << " rect=" << rect;
-#endif
-            viewport()->update(rect);
-        }
-    }
-}
-
-/*
-    This slot is called when items are changed in the model. The
-    changed items are those from topLeft to bottomRight
-    inclusive. If just one item is changed topLeft ==
-    bottomRight.
-*/
-void CompactView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
-{
-    // Single item changed
-    if (topLeft == bottomRight && topLeft.isValid())
-    {
-        update(topLeft);
-        return;
-    }
-
-    viewport()->update();
-}
 
 //Get the rowheight. There are three kinds of row heights.
 // 1. nodes (fixed height)
@@ -1024,7 +708,7 @@ void CompactView::rowProperties(int start,int& rowHeight,int &itemsInRow,std::ve
 
     for(int i=start; i < itemsCount; i++)
     {
-        CompactViewItem* item=&(viewItems_[i]);
+        TreeNodeViewItem* item=&(viewItems_[i]);
         rowHeight=qMax(rowHeight,static_cast<int>(item->height));
         itemsInRow++;
         if(item->total == 0)
@@ -1036,7 +720,7 @@ void CompactView::rowProperties(int start,int& rowHeight,int &itemsInRow,std::ve
         if(item->parentItem >=0)
         {
             //The parent item. It is always a node.
-            CompactViewItem* pt=&(viewItems_[item->parentItem]);
+            TreeNodeViewItem* pt=&(viewItems_[item->parentItem]);
 
             if(item->hasMoreSiblings)
             {
@@ -1074,7 +758,7 @@ int CompactView::rowHeight(int start,int forward, int &itemsInRow) const
     else
     {
         UI_ASSERT(start >= 0,"start=" << start << " total=" << viewItems_.size());
-        UI_ASSERT(start < viewItems_.size(),"start=" << start << " total=" << viewItems_.size());
+        UI_ASSERT(start < static_cast<int>(viewItems_.size()),"start=" << start << " total=" << viewItems_.size());
         rh=qMax(rh,viewItems_[start].height);
         itemsInRow++;
         for(int i=start-1; i >= 0; i--)
@@ -1094,7 +778,7 @@ int CompactView::itemCountInRow(int start) const
 {
     const std::size_t itemsCount = viewItems_.size();
     int itemsInRow=0;
-    for(int i=start; i < itemsCount; i++)
+    for(std::size_t i=start; i < itemsCount; i++)
     {
         itemsInRow++;
         if(viewItems_[i].total == 0)
@@ -1107,7 +791,7 @@ int CompactView::itemCountInRow(int start) const
 
 int CompactView::itemRow(int item) const
 {
-    if(item < 0 || item >= viewItems_.size())
+    if(item < 0 || item >= static_cast<int>(viewItems_.size()))
        return -1;
 
     int row=-1;
@@ -1157,12 +841,6 @@ int CompactView::firstVisibleItem(int &offset) const
     return -1;
 }
 
-void CompactView::resizeEvent(QResizeEvent *event)
-{
-    QAbstractScrollArea::resizeEvent(event);
-    updateScrollBars();
-    viewport()->update();
-}
 
 //This has to be very quick. Called after each collapse/expand.
 void CompactView::updateRowCount()
@@ -1244,107 +922,6 @@ void CompactView::updateScrollBars()
     }
 }
 
-void CompactView::doDelayedWidthAdjustment()
-{
-    if(!delayedWidth_.isActive())
-    {
-        delayedWidth_.start(0,this);
-    }
-}
-
-int CompactView::translation() const
-{
-    return horizontalScrollBar()->value();
-}
-
-void CompactView::scrollTo(const QModelIndex &index)
-{
-    if(!index.isValid())
-        return;
-
-    //d->executePostedLayout();
-    updateScrollBars();
-
-    // Expand all parents if the parent(s) of the node are not expanded.
-    QList<QModelIndex> parentLst;
-    QModelIndex parent = index.parent();
-    while(parent.isValid())
-    {
-        parentLst.prepend(parent);
-        parent = model_->parent(parent);
-    }
-
-    Q_FOREACH(QModelIndex pt,parentLst)
-    {
-        if(!isExpanded(pt))
-            expand(pt);
-    }
-
-    int item = viewIndex(index);
-    if (item < 0)
-        return;
-
-    if (verticalScrollMode_ == ScrollPerItem)
-    {
-        int row=itemRow(item);
-
-        int top = verticalScrollBar()->value();
-        int bottom = top + verticalScrollBar()->pageStep();
-
-        if (row >= top && row < bottom)
-        {
-            // nothing to do
-        }
-        else if(row < top)
-        {
-            verticalScrollBar()->setValue(row);
-        }
-        else
-        {
-            verticalScrollBar()->setValue(row);
-#if 0
-            const int currentItemHeight = viewItem_[item].height;
-            int y = area.height();
-            if (y > currentItemHeight)
-            {
-                while (item >= 0)
-                {
-                    y -= viewItem_[item].height;
-                    if (y < 0)
-                    { //there is no more space left
-                        item++;
-                        break;
-                    }
-                    item--;
-                }
-            }
-            verticalScrollBar()->setValue(item);
-#endif
-        }
-    }
-    else // ScrollPerPixel
-    {
-
-    }
-
-    // horizontal
-    int viewportWidth = viewport()->width();
-    int xp=viewItems_[item].x;
-    int horizontalPosition=xp-horizontalScrollBar()->value();
-
-    if( horizontalPosition< 0)
-    {
-        xp-=10;
-        if(xp < 0) xp=0;
-        horizontalScrollBar()->setValue(xp);
-    }
-    else if(horizontalPosition > viewportWidth)
-    {
-        xp-=10;
-        horizontalScrollBar()->setValue(xp);
-    }
-}
-
 /*
   Returns the rectangle on the viewport occupied by the item at \a index.
   If the index is not visible or explicitly hidden, the returned rectangle is invalid.
@@ -1371,13 +948,6 @@ QRect CompactView::visualRect(const QModelIndex &index) const
     return QRect();
 }
 
-//point is in viewport coordinates
-QModelIndex CompactView::indexAt(const QPoint &point) const
-{
-    int item=itemAtCoordinate(point);
-    return (item>=0)?viewItems_[item].index:QModelIndex();
-}
-
 //Returns the viewport y coordinate for  item.
 void CompactView::coordinateForItem(int item,int& itemY,int& itemRowHeight) const
 {
@@ -1464,701 +1034,7 @@ int CompactView::itemAtRowCoordinate(int start,int count,int logicalXPos) const
     return -1;
 }
 
-QModelIndex CompactView::modelIndex(int i) const
-{
-    if(i < 0 || i >= viewItems_.size())
-        return QModelIndex();
-
-    return viewItems_[i].index;
-}
-
-//Returns the index of the view item representing the given index
-int CompactView::viewIndex(const QModelIndex& index) const
-{
-    if(!index.isValid() || viewItems_.empty())
-        return -1;
-
-    const int totalCount = static_cast<int>(viewItems_.size());
-    const QModelIndex topIndex = index.sibling(index.row(), 0);
-    const int row = topIndex.row();
-    const qint64 internalId = topIndex.internalId();
-
-    // We start nearest to the lastViewedItem
-    int localCount = qMin(lastViewedItem_ - 1, totalCount - lastViewedItem_);
-    for(int i = 0; i < localCount; ++i)
-    {
-        const QModelIndex &idx1 = viewItems_[lastViewedItem_ + i].index;
-        if(idx1.row() == row && idx1.internalId() == internalId)
-        {
-            lastViewedItem_ = lastViewedItem_ + i;
-            return lastViewedItem_;
-        }
-        const QModelIndex &idx2 = viewItems_[lastViewedItem_ - i - 1].index;
-        if(idx2.row() == row && idx2.internalId() == internalId)
-        {
-            lastViewedItem_ = lastViewedItem_ - i - 1;
-            return lastViewedItem_;
-        }
-    }
-
-    for(int j = qMax(0, lastViewedItem_ + localCount); j < totalCount; ++j)
-    {
-        const QModelIndex &idx = viewItems_[j].index;
-        if (idx.row() == row && idx.internalId() == internalId)
-        {
-            lastViewedItem_ = j;
-            return j;
-        }
-    }
-    for(int j = qMin(totalCount, lastViewedItem_ - localCount) - 1; j >= 0; --j)
-    {
-        const QModelIndex &idx = viewItems_[j].index;
-        if (idx.row() == row && idx.internalId() == internalId)
-        {
-            lastViewedItem_ = j;
-            return j;
-        }
-    }
-
-    // nothing found
-    return -1;
-}
-
-void CompactView::insertViewItems(int pos, int count, const CompactViewItem &viewItem)
-{
-    ViewItemIterator it=viewItems_.begin();
-    viewItems_.insert(it+pos,count,viewItem);
-
-    //We need to update the parentItem in the items after the insertion
-    const int itemsCount=static_cast<int>(viewItems_.size());
-    for(int i = pos + count; i < itemsCount; i++)
-        if (viewItems_[i].parentItem >= pos)
-            viewItems_[i].parentItem += count;
-}
-
-
-void CompactView::removeViewItems(int pos, int count)
-{
-    ViewItemIterator it=viewItems_.begin();
-    viewItems_.erase(it+pos,it+pos+count);
-
-    //We need to update the parentItem in the items after the deletion
-    const int itemsCount=static_cast<int>(viewItems_.size());
-    for(int i=0; i < itemsCount; i++)
-        if(viewItems_[i].parentItem >= pos)
-           viewItems_[i].parentItem -= count;
-}
-
-
-//---------------------------------------
-// Expand / collapse
-//---------------------------------------
-
-int CompactView::totalNumOfChildren(const QModelIndex& idx,int& num) const
-{
-    int count=model_->rowCount(idx);
-    num+=count;
-    for(int i=0; i < count; i++)
-    {
-        QModelIndex chIdx=model_->index(i,0,idx);
-        totalNumOfChildren(chIdx,num);
-    }
-}
-
-int CompactView::totalNumOfExpandedChildren(const QModelIndex& idx,int& num) const
-{
-    int count=model_->rowCount(idx);
-    num+=count;
-    for(int i=0; i < count; i++)
-    {
-        QModelIndex chIdx=model_->index(i,0,idx);
-        if(isIndexExpanded(chIdx))
-        {
-            totalNumOfExpandedChildren(chIdx,num);
-        }
-    }
-}
-
-void CompactView::expand(int item)
-{
-    if(item != -1 && !viewItems_[item].expanded)
-    {
-        QModelIndex idx=viewItems_[item].index;
-
-        //mark the item as expanded
-        storeExpanded(idx);
-        viewItems_[item].expanded = true;
-
-        //The total number items to be inserted
-        int total=0;
-        totalNumOfExpandedChildren(idx,total);
-
-        //Insert the required number items
-        ViewItemIterator it=viewItems_.begin();
-        viewItems_.insert(it+item+1,total,CompactViewItem());
-
-        //recursively relayout the item
-        layout(item,false,false,true);
-
-        UI_ASSERT(viewItems_[item].total==total,"viewItems_[" << item << "].total=" << viewItems_[item].total <<
-                  " total=" << total);
-
-        //We need to update the parentItem in the items after the insertion.
-        //When layout() is called with the given arguments it is delayed to
-        //this point to gain performance!
-        const int itemsCount=static_cast<int>(viewItems_.size());
-        int count=viewItems_[item].total;
-        for(int i = item + count+1; i < itemsCount; i++)
-            if (viewItems_[i].parentItem >= item)
-                viewItems_[i].parentItem += count;
-
-        //update the scrollbars and rerender the viewport
-        updateRowCount();
-        updateScrollBars();
-        viewport()->update();
-    }
-}
-
-void CompactView::expand(const QModelIndex &idx)
-{
-    int item=viewIndex(idx);
-    expand(item);
-}
-
-void CompactView::expandAll(const QModelIndex& idx)
-{
-    int item = viewIndex(idx);
-    if (item != -1) // is visible
-    {
-        //first we need to collapse all the children to start
-        //with a managable state.
-        collapseAllCore(idx);
-
-        //mark the item as expanded
-        storeExpanded(idx);
-        viewItems_[item].expanded = true;
-
-        //The total number items to be inserted
-        int total=0;
-        totalNumOfChildren(idx,total);
-
-        //Insert the required number items
-        ViewItemIterator it=viewItems_.begin();
-        viewItems_.insert(it+item+1,total,CompactViewItem());
-
-        //recursively relayout the item
-        layout(item,true,false,true);
-
-        UI_ASSERT(viewItems_[item].total==total,"viewItems_[" << item << "].total=" << viewItems_[item].total <<
-                  " total=" << total);
-
-        //We need to update the parentItem in the items after the insertion.
-        //When layout() is called with the given arguments it is delayed to
-        //this point to gain performance!
-        const int itemsCount=static_cast<int>(viewItems_.size());
-        int count=viewItems_[item].total;
-        for(int i = item + count+1; i < itemsCount; i++)
-            if (viewItems_[i].parentItem >= item)
-                viewItems_[i].parentItem += count;
-
-
-        //update the scrollbars and rerender the viewport
-        updateRowCount();
-        updateScrollBars();
-        viewport()->update();
-    }
-}
-
-void CompactView::restoreExpand(const QModelIndex& idx)
-{
-    //expandedIndexed now contains all the indexes to expand
-    expand(idx);
-}
-
-void CompactView::collapse(int item)
-{
-    if (item == -1 || expandedIndexes.isEmpty())
-        return;
-
-    const QModelIndex &modelIndex = viewItems_.at(item).index;
-    //if(!isPersistent(modelIndex))
-    //       return; // if the index is not persistent, no chances it is expanded
-
-    QSet<QPersistentModelIndex>::iterator it = expandedIndexes.find(modelIndex);
-    if (it == expandedIndexes.end() || viewItems_.at(item).expanded == false)
-           return; // nothing to do
-
-    expandedIndexes.erase(it);
-    viewItems_[item].expanded = false;
-    int total=viewItems_[item].total;
-    int index = item;
-    while (index > -1)
-    {
-        viewItems_[index].total-=total;
-        index = viewItems_[index].parentItem;
-    }
-    removeViewItems(item + 1, total); // collapse
-}
-
-void CompactView::collapse(const QModelIndex &index)
-{
-    int i = viewIndex(index);
-    if (i != -1) // is visible
-    {
-        collapse(i);
-        updateRowCount();
-        updateScrollBars();
-        viewport()->update();
-    }
-}
-
-bool CompactView::collapseAllCore(const QModelIndex &index)
-{
-    //identify item
-    int item = viewIndex(index);
-
-    //check if there is nothing to do
-    if (item == -1 || expandedIndexes.isEmpty())
-        return false;
-
-    //check if the item is expanded
-    QSet<QPersistentModelIndex>::iterator it = expandedIndexes.find(index);
-    if (it == expandedIndexes.end() || viewItems_.at(item).expanded == false)
-           return false;
-
-    //remove all the children of the item
-    viewItems_[item].expanded = false;
-    int total=viewItems_[item].total;
-    int parentItem = item;
-    while (parentItem > -1)
-    {
-        viewItems_[parentItem].total-=total;
-        parentItem = viewItems_[parentItem].parentItem;
-    }
-    removeViewItems(item + 1, total);
-
-    //recursivel remove the indexes related to the deleted items from the expanded set
-    removeAllFromExpanded(index);
-
-    updateRowCount();
-    return true;
-}
-
-void CompactView::collapseAll(const QModelIndex &index)
-{
-    if(collapseAllCore(index))
-    {
-        updateScrollBars();
-        viewport()->update();
-    }
-}
-
-void CompactView::removeAllFromExpanded(const QModelIndex &index)
-{
-    if(expandedIndexes.isEmpty())
-        return;
-
-    QSet<QPersistentModelIndex>::iterator it = expandedIndexes.find(index);
-    if(it == expandedIndexes.end())
-       return;
-
-    expandedIndexes.erase(it);
-
-    for(int i=0; i < model_->rowCount(index); i++)
-    {
-        QModelIndex chIdx=model_->index(i, 0, index);
-        removeAllFromExpanded(chIdx);
-    }
-}
-
-
-bool CompactView::isExpanded(const QModelIndex &index) const
-{
-    return isIndexExpanded(index);
-}
-
-void CompactView::setExpanded(const QModelIndex &index, bool expanded)
-{
-    if (expanded)
-        expand(index);
-    else
-        collapse(index);
-}
-
-//Expands all expandable items.
-void CompactView::expandAll()
-{
-    viewItems_.clear();
-    expandedIndexes.clear();
-    //d->interruptDelayedItemsLayout();
-    layout(-1, true,false,false);
-    updateRowCount();
-    updateScrollBars();
-    viewport()->update();
-}
-
-//Collapses all expanded items.
-void CompactView::collapseAll()
-{
-    expandedIndexes.clear();
-    doItemsLayout();
-}
-
-//========================================================
-//
-// Selection
-//
-//========================================================
-
-void CompactView::setCurrentIndex(const QModelIndex &index)
-{
-    if(selectionModel_ && index.isValid())
-    {
-        QItemSelectionModel::SelectionFlags command = selectionCommand(index, 0);
-        selectionModel_->setCurrentIndex(index, command);
-        //currentIndexSet_ = true;
-        QPoint offset;
-        if((command & QItemSelectionModel::Current) == 0)
-            //pressedPosition_ = visualRect(currentIndex()).center() + offset;
-            pressedRefIndex_=currentIndex();
-    }
-}
-
-
-QModelIndex CompactView::currentIndex() const
-{
-    return selectionModel_ ? selectionModel_->currentIndex() : QModelIndex();
-}
-
-QModelIndexList CompactView::selectedIndexes() const
-{
-    if(selectionModel_)
-        return selectionModel_->selectedIndexes();
-
-    return QModelIndexList();
-}
-
-
-/*
-  Applies the selection command to the items in or touched by the
-  rectangle rect.
-*/
-void CompactView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command)
-{
-    if (!selectionModel_ || rect.isNull())
-        return;
-
-#ifdef _UI_COMPACTVIEW_DEBUG
-    UiLog().dbg() << "CompactView::setSelection --> rect=" << rect;
-#endif
-
-    QPoint tl=QPoint(rect.x(),rect.y());
-    QPoint br=QPoint(rect.x()+rect.width(),rect.y()+rect.height());
-
-    if(tl.y() > br.y())
-        qSwap(tl,br);
-
-    QModelIndex topLeft = indexAt(tl);
-    QModelIndex bottomRight = indexAt(br);
-
-#ifdef _UI_COMPACTVIEW_DEBUG
-    UiLog().dbg() << " tl=" << tl  << " " << topLeft.data().toString() <<
-                     " br=" << br  << " " << bottomRight.data().toString();
-#endif
-
-    if (!topLeft.isValid() && !bottomRight.isValid())
-    {
-        if(command & QItemSelectionModel::Clear)
-            selectionModel_->clear();
-        return;
-    }
-
-    if (!topLeft.isValid() && !viewItems_.empty())
-        topLeft = viewItems_.front().index;
-
-    if (!bottomRight.isValid() && !viewItems_.empty())
-    {
-        const QModelIndex index = viewItems_.back().index;
-        bottomRight = index.sibling(index.row(),0);
-    }
-
-    select(topLeft, bottomRight, command);
-}
-
-void CompactView::select(const QModelIndex &topIndex, const QModelIndex &bottomIndex,
-                              QItemSelectionModel::SelectionFlags command)
-{
-    QItemSelection selection;
-    const int top = viewIndex(topIndex),
-    bottom = viewIndex(bottomIndex);
-
-#ifdef _UI_COMPACTVIEW_DEBUG
-    UiLog().dbg() << "CompactView::select --> command="  << command;
-    UiLog().dbg() << "top=" << top << " " << topIndex.data().toString() <<
-                     " bottom=" << bottom << " " << bottomIndex.data().toString();
-#endif
-
-    QModelIndex previous;
-    QItemSelectionRange currentRange;
-    QStack<QItemSelectionRange> rangeStack;
-    for(int i = top; i <= bottom; ++i)
-    {
-        QModelIndex index = modelIndex(i);
-        QModelIndex parent = index.parent();
-        QModelIndex previousParent = previous.parent();
-
-        //same parent as previous
-        if (previous.isValid() && parent == previousParent)
-        {
-            //same parent
-            if (qAbs(previous.row() - index.row()) > 1)
-            {
-                //a hole (hidden index inside a range) has been detected
-                if (currentRange.isValid())
-                {
-                    selection.append(currentRange);
-                }
-                //let's start a new range
-                currentRange = QItemSelectionRange(index, index);
-            }
-
-            else
-            {
-                QModelIndex tl = model_->index(currentRange.top(),0,
-                        currentRange.parent());
-                currentRange = QItemSelectionRange(tl, index);
-            }
-        }
-
-        //The current parent is the previous item
-        else if(previous.isValid() &&
-                parent == model_->index(previous.row(), 0, previousParent))
-        {            
-            rangeStack.push(currentRange);
-            currentRange = QItemSelectionRange(index, index);
-        }
-
-        else
-        {
-            if(currentRange.isValid())
-                selection.append(currentRange);
-            if(rangeStack.isEmpty())
-            {
-                currentRange = QItemSelectionRange(index, index);
-            }
-            else
-            {
-                currentRange = rangeStack.pop();
-                index = currentRange.bottomRight(); //let's resume the range
-                --i; //we process again the current item
-            }
-        }
-
-        previous = index;
-    }
-
-    if (currentRange.isValid())
-        selection.append(currentRange);
-
-    for (int i = 0; i < rangeStack.count(); ++i)
-        selection.append(rangeStack.at(i));
-
-    selectionModel_->select(selection, command);
-}
-
-
-/*
-    Returns the SelectionFlags to be used when updating a selection with
-    to include the index specified. The  event is a user input event,
-    such as a mouse or keyboard event.
-*/
-
-QItemSelectionModel::SelectionFlags CompactView::selectionCommand(
-    const QModelIndex &index, const QEvent *event) const
+void CompactView::updateViewport(const QRect rect)
 {
-    Qt::KeyboardModifiers modifiers = QApplication::keyboardModifiers();
-    if (event) {
-
-        switch (event->type()) {
-        case QEvent::MouseMove: {
-            // Toggle on MouseMove
-            modifiers = static_cast<const QMouseEvent*>(event)->modifiers();
-            if (modifiers & Qt::ControlModifier)
-                return QItemSelectionModel::ToggleCurrent|selectionBehaviorFlags();
-            break;
-        }
-        case QEvent::MouseButtonPress: {
-            modifiers = static_cast<const QMouseEvent*>(event)->modifiers();
-            const Qt::MouseButton button = static_cast<const QMouseEvent*>(event)->button();
-            const bool rightButtonPressed = button & Qt::RightButton;
-            const bool shiftKeyPressed = modifiers & Qt::ShiftModifier;
-            const bool controlKeyPressed = modifiers & Qt::ControlModifier;
-            const bool indexIsSelected = selectionModel_->isSelected(index);
-            if ((shiftKeyPressed || controlKeyPressed) && rightButtonPressed)
-                return QItemSelectionModel::NoUpdate;
-            if (!shiftKeyPressed && !controlKeyPressed && indexIsSelected)
-                return QItemSelectionModel::NoUpdate;
-            if (!index.isValid() && !rightButtonPressed && !shiftKeyPressed && !controlKeyPressed)
-                return QItemSelectionModel::Clear;
-            if (!index.isValid())
-                return QItemSelectionModel::NoUpdate;
-            break;
-        }
-        case QEvent::MouseButtonRelease: {
-            // ClearAndSelect on MouseButtonRelease if MouseButtonPress on selected item or empty area
-            modifiers = static_cast<const QMouseEvent*>(event)->modifiers();
-            const Qt::MouseButton button = static_cast<const QMouseEvent*>(event)->button();
-            const bool rightButtonPressed = button & Qt::RightButton;
-            const bool shiftKeyPressed = modifiers & Qt::ShiftModifier;
-            const bool controlKeyPressed = modifiers & Qt::ControlModifier;
-            if (((index == pressedIndex_ && selectionModel_->isSelected(index))
-                || !index.isValid()) //&& state != QAbstractItemView::DragSelectingState
-                && !shiftKeyPressed && !controlKeyPressed && (!rightButtonPressed || !index.isValid()))
-                return QItemSelectionModel::ClearAndSelect|selectionBehaviorFlags();
-            return QItemSelectionModel::NoUpdate;
-        }
-        case QEvent::KeyPress: {
-            // NoUpdate on Key movement and Ctrl
-            modifiers = static_cast<const QKeyEvent*>(event)->modifiers();
-            switch (static_cast<const QKeyEvent*>(event)->key()) {
-            case Qt::Key_Backtab:
-                modifiers = modifiers & ~Qt::ShiftModifier; // special case for backtab
-            case Qt::Key_Down:
-            case Qt::Key_Up:
-            case Qt::Key_Left:
-            case Qt::Key_Right:
-            case Qt::Key_Home:
-            case Qt::Key_End:
-            case Qt::Key_PageUp:
-            case Qt::Key_PageDown:
-            case Qt::Key_Tab:
-                if (modifiers & Qt::ControlModifier
-#ifdef QT_KEYPAD_NAVIGATION
-                    // Preserve historical tab order navigation behavior
-                    || QApplication::navigationMode() == Qt::NavigationModeKeypadTabOrder
-#endif
-                    )
-                    return QItemSelectionModel::NoUpdate;
-                break;
-            case Qt::Key_Select:
-                return QItemSelectionModel::Toggle|selectionBehaviorFlags();
-            case Qt::Key_Space:// Toggle on Ctrl-Qt::Key_Space, Select on Space
-                if (modifiers & Qt::ControlModifier)
-                    return QItemSelectionModel::Toggle|selectionBehaviorFlags();
-                return QItemSelectionModel::Select|selectionBehaviorFlags();
-            default:
-                break;
-            }
-        }
-        default:
-            break;
-        }
-    }
-
-    if (modifiers & Qt::ShiftModifier)
-        return QItemSelectionModel::SelectCurrent|selectionBehaviorFlags();
-    if (modifiers & Qt::ControlModifier)
-        return QItemSelectionModel::Toggle|selectionBehaviorFlags();
-    //if (state == QAbstractItemView::DragSelectingState) {
-    //    //when drag-selecting we need to clear any previous selection and select the current one
-    //    return QItemSelectionModel::Clear|QItemSelectionModel::SelectCurrent|selectionBehaviorFlags();
-    //}
-
-    return QItemSelectionModel::ClearAndSelect|selectionBehaviorFlags();
+    viewport()->update(rect);
 }
-
-/*
-  Returns the rectangle from the viewport of the items in the given
-  selection.
-
-  The returned region only contains rectangles intersecting
-  (or included in) the viewport.
-*/
-QRegion CompactView::visualRegionForSelection(const QItemSelection &selection) const
-{
-    if(selection.isEmpty())
-        return QRegion();
-
-    QRegion selectionRegion;
-    const QRect &viewportRect = viewport()->rect();
-    for(int i = 0; i < selection.count(); ++i)
-    { 
-        QItemSelectionRange range = selection.at(i);
-        if (!range.isValid())
-            continue;
-
-        QModelIndex leftIndex = range.topLeft();
-        if (!leftIndex.isValid())
-            continue;
-
-        QModelIndex rightIndex = range.bottomRight();
-        if (!rightIndex.isValid())
-            continue;
-
-        int left=100000000,right=0,top=1000000000, bottom=0;
-        Q_FOREACH(QModelIndex idx,range.indexes())
-        {
-            const QRect r = visualRect(idx);
-            //UiLog().dbg() << r << " " << idx << " " << idx.data().toString();
-            if(r.x() < left) left=r.x();
-            if(r.right()+1 > right) right=r.right()+1;
-            if(r.y() < top) top=r.y();
-            if(r.bottom()+1 > bottom ) bottom=r.bottom()+1;
-        }
-
-        top-=1;
-        bottom+=1;
-
-        QRect combined(left,top,right-left+1,bottom-top+1);
-        if (viewportRect.intersects(combined))
-                selectionRegion += combined;
-    }
-    return selectionRegion;
-}
-
-/*
-    This slot is called when the selection is changed. The previous
-    selection (which may be empty), is specified by  deselected, and the
-    new selection by selected.
-*/
-void CompactView::selectionChanged(const QItemSelection &selected,
-                                   const QItemSelection &deselected)
-{
-    if(isVisible()) // && updatesEnabled()) {
-    {
-        QRegion des=visualRegionForSelection(deselected);
-        QRegion sel=visualRegionForSelection(selected);
-
-#ifdef _UI_COMPACTVIEW_DEBUG
-        UiLog().dbg() << "CompactView::selectionChanged -->";
-        UiLog().dbg() << "  deselect=" << des.boundingRect() << " select=" << sel.boundingRect();
-        QRegion un=des | sel;
-        UiLog().dbg() << "  union=" << un.boundingRect();
-#endif
-        viewport()->update(des | sel);
-    }
-}
-
-/*
-    This slot is called when a new item becomes the current item.
-    The previous current item is specified by the previous index, and the new
-    item by the current index.
-*/
-void CompactView::currentChanged(const QModelIndex &current, const QModelIndex &previous)
-{
-    if(!isVisible())
-        return;
-
-    if(previous.isValid())
-    {
-        update(previous);
-    }
-
-    if(current.isValid())
-    {
-        scrollTo(current);
-        update(current);
-    }
-}
-
-
diff --git a/Viewer/src/CompactView.hpp b/Viewer/src/CompactView.hpp
index e9f67b1..ae72fc5 100644
--- a/Viewer/src/CompactView.hpp
+++ b/Viewer/src/CompactView.hpp
@@ -20,196 +20,45 @@
 #include <QSet>
 #include <QStyleOptionViewItem>
 
+#include "AbstractNodeView.hpp"
+
 class TreeNodeModel;
 class GraphNodeViewItem;
-class CompactNodeViewDelegate;
 class QStyledItemDelegate;
 
-//Struct representing visible items in the view. When an item is collapsed
-//all its children will be removed from viewItems.
-struct CompactViewItem
-{
-    CompactViewItem() : parentItem(-1), total(0), widestInSiblings(0), expanded(0), hasChildren(0),
-                      hasMoreSiblings(0), level(0), width(0), height(0), x(0) {}
-
-    QModelIndex index; //the model index represented by the item.
-                       //We remove items whenever the indexes are invalidated
-    int parentItem; // parent item index in viewItems
-    uint total; // total number of visible children in the view
-    uint widestInSiblings;
-    uint expanded : 1; //the item expanded
-    uint hasChildren : 1; // if the item has children in the model (it is
-                          // independent of the expanded/collapsed state)
-    uint hasMoreSiblings : 1;
-    uint level : 12; // indentation
-    uint width: 12;
-    uint height : 16;
-    uint x: 16;
-
-    int right() const {return x+width;}
-    int alignedRight() const {return x+widestInSiblings;}
-    bool isFirstChild() const {return index.row() ==0;}
-    bool isLeaf() const {return total == 0;}
-};
-
-
-class CompactView : public QAbstractScrollArea
+class CompactView : public AbstractNodeView
 {
-Q_OBJECT
 
 public:
     explicit CompactView(TreeNodeModel* model,QWidget *parent=0);
     ~CompactView();
 
-    QModelIndex currentIndex() const;
-    QModelIndexList selectedIndexes() const;
-    QModelIndex indexAt(const QPoint &point) const;
     QRect visualRect(const QModelIndex &index) const;
-    bool isExpanded(const QModelIndex &index) const;
-    void setExpanded(const QModelIndex &index, bool expanded);
-    void expandAll(const QModelIndex &index);
-    void collapseAll(const QModelIndex &index);
-
-public Q_SLOTS:
-    void reset();
-    void setCurrentIndex(const QModelIndex &index);
-    void update(const QModelIndex &index);
-    void expand(const QModelIndex &index);
-    void collapse(const QModelIndex &index);
-    void expandAll();
-    void collapseAll();
 
-protected Q_SLOTS:
-    void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
-    void rowsInserted(const QModelIndex&,int,int);
-    void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
-    void rowsRemoved(const QModelIndex &parent, int start, int end);
-    virtual void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
-    void currentChanged(const QModelIndex &current, const QModelIndex &previous);
-
-Q_SIGNALS:
-    void doubleClicked(const QModelIndex&);
-
-protected:
-    void mousePressEvent(QMouseEvent* event);
-    void mouseReleaseEvent(QMouseEvent *event);
-    void mouseDoubleClickEvent(QMouseEvent *event);
-    void keyPressEvent(QKeyEvent *event);
-    void paintEvent(QPaintEvent *event);
-    void resizeEvent(QResizeEvent *event);
-    bool viewportEvent(QEvent *event);
-    void timerEvent(QTimerEvent *event);
-
-    void attachModel();
-    void insertItems(const QModelIndex& parent, int);
+protected:   
     void paint(QPainter *painter,const QRegion& region);
     void drawRow(QPainter* painter,int start,int xOffset,int &yp,int &itemsInRow,std::vector<int>&);
 
-    void doItemsLayout(bool hasRemovedItems=false);
     void layout(int parentId, bool recursiveExpanding,bool afterIsUninitialized,bool preAllocated);
 
-    void scrollTo(const QModelIndex &index);
     int itemRow(int item) const;
     int itemCountInRow(int start) const;
     void rowProperties(int start,int& rowHeight,int &itemsInRow,std::vector<int>& indentVec) const;
-    int rowHeight(int start,int forward,int &itemsInRow) const;   
+    int rowHeight(int start,int forward,int &itemsInRow) const;
     void coordinateForItem(int item,int& itemY,int& itemRowHeight) const;
     int itemAtCoordinate(const QPoint& coordinate) const;
     int itemAtRowCoordinate(int start,int count,int xPos) const;
-
-    QModelIndex modelIndex(int i) const;
-    int viewIndex(const QModelIndex& index) const;
-
-    void restoreExpand(const QModelIndex& idx);
-    void removeAllFromExpanded(const QModelIndex &index);
-
-    void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command);
-    void select(const QModelIndex &topIndex, const QModelIndex &bottomIndex,
-                                  QItemSelectionModel::SelectionFlags command);
-
-    QItemSelectionModel::SelectionFlags selectionCommand(const QModelIndex &index,
-                                                         const QEvent *event) const;
-
-    QRegion visualRegionForSelection(const QItemSelection &selection) const;
+    bool isPointInExpandIndicator(int,QPoint) const {return false;}
 
     int  firstVisibleItem(int &offset) const;
     void updateRowCount();
     void updateScrollBars();
-    void adjustWidthInParent(int start);
-    //void shiftItems(int start);
-    //void shiftItems(int start,int diff);
-
-    void setExpectedBg(QColor c) {expectedBg_=c;}
-    void setConnectorColour(QColor c) {connectorColour_=c;}
-
-    enum ScrollMode {
-          ScrollPerItem,
-          ScrollPerPixel
-      };
+    void updateViewport(const QRect rect);
 
-    TreeNodeModel* model_;
-    CompactNodeViewDelegate* delegate_;
-
-    // used when expanding and collapsing items
-    QSet<QPersistentModelIndex> expandedIndexes;
+    void adjustWidthInParent(int start);
 
 private:
-    int totalNumOfChildren(const QModelIndex& idx,int& num) const;
-    int totalNumOfExpandedChildren(const QModelIndex& idx,int& num) const;
-    void expand(int item);
-    void collapse(int item);
-    bool collapseAllCore(const QModelIndex &index);
-
-    void insertViewItems(int pos, int count, const CompactViewItem &viewItem);
-    void removeViewItems(int pos, int count);
-
-    void doDelayedWidthAdjustment();
-
-    int connectorPos(CompactViewItem* item, CompactViewItem* parent) const;
-    int translation() const;
-
-    typedef std::vector<CompactViewItem>::iterator ViewItemIterator;
-    ScrollMode verticalScrollMode_;
-    mutable std::vector<CompactViewItem> viewItems_;
-    int rowCount_;
-    int maxRowWidth_;
-    mutable int lastViewedItem_;
-    QModelIndex root_;
-    int topMargin_;
-    int leftMargin_;
-    int itemGap_;
-    int connectorGap_;
-    int expandConnectorLenght_;
-
-    QPointer<QItemSelectionModel> selectionModel_;
-    QPoint pressedPosition_;
-    QPersistentModelIndex pressedIndex_;
-    QPersistentModelIndex pressedRefIndex_;
-    bool noSelectionOnMousePress_;
-    QStyledItemDelegate* itemDelegate_;
-    QColor expectedBg_;
-    QColor connectorColour_;
-    QBasicTimer delayedWidth_;
-    int delayedTimeout_;
-
-    inline bool storeExpanded(const QPersistentModelIndex &idx)
-    {
-       if(expandedIndexes.contains(idx))
-            return false;
-        expandedIndexes.insert(idx);
-            return true;
-    }
-
-    inline bool isIndexExpanded(const QModelIndex &idx) const
-    {
-        //We first check if the idx is a QPersistentModelIndex, because creating QPersistentModelIndex is slow
-        return expandedIndexes.contains(idx);
-    }
-
-    inline QItemSelectionModel::SelectionFlags selectionBehaviorFlags() const
-    {
-        return QItemSelectionModel::NoUpdate;
-    }
+    int connectorPos(TreeNodeViewItem* item, TreeNodeViewItem* parent) const;
 };
 
 #endif // COMPACTVIEW_HPP
diff --git a/Viewer/src/CustomCommandHandler.cpp b/Viewer/src/CustomCommandHandler.cpp
index 45c7949..90c6bc9 100644
--- a/Viewer/src/CustomCommandHandler.cpp
+++ b/Viewer/src/CustomCommandHandler.cpp
@@ -51,7 +51,7 @@ void CustomCommandHandler::init()
 CustomCommand* CustomCommandHandler::replace(int index, const std::string& name, const std::string& command, bool context)
 {
     assert(index >= 0);
-    assert(index < items_.size());
+    assert(index < static_cast<int>(items_.size()));
 
     CustomCommand *item;
 
@@ -74,7 +74,7 @@ CustomCommand* CustomCommandHandler::replace(int index, const CustomCommand &cmd
 void CustomCommandHandler::remove(int index)
 {
     assert(index >= 0);
-    assert(index < items_.size());
+    assert(index < static_cast<int>(items_.size()));
 
     items_.erase(items_.begin()+index);
 
@@ -84,7 +84,7 @@ void CustomCommandHandler::remove(int index)
 CustomCommand* CustomCommandHandler::duplicate(int index)
 {
     assert(index >= 0);
-    assert(index < items_.size());
+    assert(index < static_cast<int>(items_.size()));
 
     CustomCommand *item = items_[index];
     std::string postfix("_1");
@@ -104,9 +104,9 @@ CustomCommand* CustomCommandHandler::duplicate(int index)
 void CustomCommandHandler::swapCommandsByIndex(int i1, int i2)
 {
     assert(i1 >= 0);
-    assert(i1 < items_.size());
+    assert(i1 < static_cast<int>(items_.size()));
     assert(i2 >= 0);
-    assert(i2 < items_.size());
+    assert(i2 < static_cast<int>(items_.size()));
 
     CustomCommand *temp = items_[i2];
     items_[i2] = items_[i1];
@@ -166,12 +166,12 @@ void CustomCommandHandler::readSettings()
 
     bool ok = vs.read(false);  // false means we don't abort if the file is not there
 
-    if (ok)
+    if(ok)
     {
         std::vector<VSettings> commands;
         vs.get("commands", commands);
 
-        for (int i = 0; i < commands.size(); i++)
+        for (std::size_t i = 0; i < commands.size(); i++)
         {
             VSettings *vsCommand = &commands[i];
             std::string emptyDefault="";
@@ -258,7 +258,7 @@ CustomCommand* CustomCommandHistoryHandler::add(const std::string& name, const s
         CustomCommand *item=new CustomCommand(name, command, context);
         items_.push_front(item);  // add it to the front
 
-        if (items_.size() > maxCommands_)  // too many commands?
+        if(static_cast<int>(items_.size()) > maxCommands_)  // too many commands?
         {
             items_.pop_back(); // remove the last item
         }
diff --git a/Viewer/src/Dashboard.cpp b/Viewer/src/Dashboard.cpp
index 497f41f..a73272b 100644
--- a/Viewer/src/Dashboard.cpp
+++ b/Viewer/src/Dashboard.cpp
@@ -106,7 +106,14 @@ DashboardWidget* Dashboard::addWidgetCore(const std::string& type)
 	}
 	else if(type == "info")
 	{
-		InfoPanel* ctl=new InfoPanel(this);       
+        InfoPanel* ctl=new InfoPanel(this);
+
+        connect(ctl,SIGNAL(popInfoPanel(VInfo_ptr,QString)),
+                this,SLOT(slotPopInfoPanel(VInfo_ptr,QString)));
+
+        connect(ctl,SIGNAL(dashboardCommand(VInfo_ptr,QString)),
+                this,SLOT(slotCommand(VInfo_ptr,QString)));
+
 		w=ctl;
 	}
 
diff --git a/Viewer/src/DashboardWidget.cpp b/Viewer/src/DashboardWidget.cpp
index 8252b02..dc613b8 100644
--- a/Viewer/src/DashboardWidget.cpp
+++ b/Viewer/src/DashboardWidget.cpp
@@ -21,8 +21,8 @@ DashboardWidget::DashboardWidget(const std::string& type, QWidget* parent) :
     QWidget(parent),
     type_(type),
     acceptSetCurrent_(false),
-    bcWidget_(0),
     ignoreMaximisedChange_(false),
+    bcWidget_(0),
     inDialog_(false)
 {
     //detach
@@ -121,12 +121,12 @@ void DashboardWidget::setInDialog(bool b)
     }
 }
 
-void DashboardWidget::writeSettings(VSettings* vs)
+void DashboardWidget::writeSettings(VComboSettings* vs)
 {
     vs->putAsBool("detached",detached());
 }
 
-void DashboardWidget::readSettings(VSettings* vs)
+void DashboardWidget::readSettings(VComboSettings* vs)
 {
     setDetached(vs->getAsBool("detached",detached()));
 }
diff --git a/Viewer/src/DashboardWidget.hpp b/Viewer/src/DashboardWidget.hpp
index f1865f2..6f5321e 100644
--- a/Viewer/src/DashboardWidget.hpp
+++ b/Viewer/src/DashboardWidget.hpp
@@ -21,7 +21,7 @@
 class DashboardDockTitleWidget;
 class NodePathWidget;
 class ServerFilter;
-class VSettings;
+class VComboSettings;
 
 class DashboardWidget : public QWidget
 {
@@ -48,8 +48,8 @@ public:
     void setEnableMaximised(bool st);
     bool isInDialog() const {return inDialog_;}
 
-    virtual void writeSettings(VSettings*);
-    virtual void readSettings(VSettings*);
+    virtual void writeSettings(VComboSettings*);
+    virtual void readSettings(VComboSettings*);
     virtual void writeSettingsForDialog() {}
     virtual void readSettingsForDialog() {}
 
@@ -63,6 +63,8 @@ Q_SIGNALS:
     void titleUpdated(QString,QString type=QString());
     void selectionChanged(VInfo_ptr);
     void maximisedChanged(DashboardWidget*);
+    void popInfoPanel(VInfo_ptr,QString);
+    void dashboardCommand(VInfo_ptr,QString);
 
 protected Q_SLOTS:
     void slotDetachedToggled(bool);
diff --git a/Viewer/src/EditItemWidget.cpp b/Viewer/src/EditItemWidget.cpp
index 9536890..f63f478 100644
--- a/Viewer/src/EditItemWidget.cpp
+++ b/Viewer/src/EditItemWidget.cpp
@@ -24,15 +24,14 @@
 //========================================================
 
 EditItemWidget::EditItemWidget(QWidget *parent) :
-   QWidget(parent),
-   preproc_(false),
-   alias_(false)
+   QWidget(parent)
 {
 	setupUi(this);
 
 	infoProvider_=new EditProvider(this);
 
-	Highlighter* ih=new Highlighter(textEdit_->document(),"script");
+    //The document becomes the owner of the highlighter
+    new Highlighter(textEdit_->document(),"script");
 
 	searchLine_->setEditor(textEdit_);
 
@@ -131,12 +130,12 @@ void EditItemWidget::on_gotoLineTb__clicked()
 
 bool EditItemWidget::alias() const
 {
-	return aliasTb_->isChecked();
+    return aliasCb_->isChecked();
 }
 
 bool EditItemWidget::preproc() const
 {
-	return preprocTb_->isChecked();
+    return preprocTb_->isChecked();
 }
 
 //-----------------------------------------
diff --git a/Viewer/src/EditItemWidget.hpp b/Viewer/src/EditItemWidget.hpp
index c608624..b486d4f 100644
--- a/Viewer/src/EditItemWidget.hpp
+++ b/Viewer/src/EditItemWidget.hpp
@@ -39,7 +39,7 @@ public:
 
 protected Q_SLOTS:
 	void on_preprocTb__toggled(bool);
-	void on_submitTb__clicked(bool);
+    void on_submitTb__clicked(bool);
 	void on_searchTb__clicked();
 	void on_gotoLineTb__clicked();
 	void on_fontSizeUpTb__clicked();
@@ -49,9 +49,6 @@ protected:
 	bool preproc() const;
 	bool alias() const;
     void updateState(const ChangeFlags&) {}
-
-	bool preproc_;
-	bool alias_;
 };
 
 #endif
diff --git a/Viewer/src/EditItemWidget.ui b/Viewer/src/EditItemWidget.ui
index 75f9e11..b0cc7d8 100644
--- a/Viewer/src/EditItemWidget.ui
+++ b/Viewer/src/EditItemWidget.ui
@@ -32,45 +32,6 @@
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
-      <spacer name="horizontalSpacer">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item>
-      <widget class="QToolButton" name="aliasTb_">
-       <property name="toolTip">
-        <string>Send as alias</string>
-       </property>
-       <property name="text">
-        <string>Submit as alias</string>
-       </property>
-       <property name="checkable">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QToolButton" name="preprocTb_">
-       <property name="toolTip">
-        <string>Pre-process text</string>
-       </property>
-       <property name="text">
-        <string>Pre-process</string>
-       </property>
-       <property name="checkable">
-        <bool>true</bool>
-       </property>
-      </widget>
-     </item>
-     <item>
       <widget class="QToolButton" name="fontSizeUpTb_">
        <property name="toolTip">
         <string>Increase font size in text editor <br><code>Ctrl++</code></string>
@@ -79,7 +40,7 @@
         <string>...</string>
        </property>
        <property name="icon">
-        <iconset>
+        <iconset resource="viewer.qrc">
          <normaloff>:/viewer/fontsize_up.svg</normaloff>:/viewer/fontsize_up.svg</iconset>
        </property>
        <property name="shortcut">
@@ -99,7 +60,7 @@
         <string>...</string>
        </property>
        <property name="icon">
-        <iconset>
+        <iconset resource="viewer.qrc">
          <normaloff>:/viewer/fontsize_down.svg</normaloff>:/viewer/fontsize_down.svg</iconset>
        </property>
        <property name="shortcut">
@@ -126,7 +87,7 @@
         <string>...</string>
        </property>
        <property name="icon">
-        <iconset>
+        <iconset resource="viewer.qrc">
          <normaloff>:/viewer/search_decor.svg</normaloff>:/viewer/search_decor.svg</iconset>
        </property>
        <property name="shortcut">
@@ -149,7 +110,7 @@
         <string>...</string>
        </property>
        <property name="icon">
-        <iconset>
+        <iconset resource="viewer.qrc">
          <normaloff>:/viewer/images/goto_line.svg</normaloff>:/viewer/images/goto_line.svg</iconset>
        </property>
        <property name="shortcut">
@@ -161,6 +122,39 @@
       </widget>
      </item>
      <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="aliasCb_">
+       <property name="text">
+        <string>Submit as alias</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="preprocTb_">
+       <property name="toolTip">
+        <string>Pre-process text</string>
+       </property>
+       <property name="text">
+        <string>Pre-process</string>
+       </property>
+       <property name="checkable">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
       <widget class="QToolButton" name="submitTb_">
        <property name="toolTip">
         <string>Submit</string>
@@ -169,7 +163,7 @@
         <string>Submit</string>
        </property>
        <property name="icon">
-        <iconset>
+        <iconset resource="viewer.qrc">
          <normaloff>:/viewer/submit.svg</normaloff>:/viewer/submit.svg</iconset>
        </property>
        <property name="toolButtonStyle">
@@ -180,8 +174,7 @@
     </layout>
    </item>
    <item>
-    <widget class="MessageLabel" name="infoLabel_" native="true">
-    </widget>
+    <widget class="MessageLabel" name="infoLabel_" native="true"/>
    </item>
    <item>
     <widget class="PlainTextEdit" name="textEdit_">
@@ -206,6 +199,12 @@
  </widget>
  <customwidgets>
   <customwidget>
+   <class>MessageLabel</class>
+   <extends>QWidget</extends>
+   <header location="global">MessageLabel.hpp</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
    <class>PlainTextSearchLine</class>
    <extends>QWidget</extends>
    <header>PlainTextSearchLine.hpp</header>
@@ -216,13 +215,9 @@
    <extends>QPlainTextEdit</extends>
    <header location="global">PlainTextEdit.hpp</header>
   </customwidget>
-  <customwidget>
-   <class>MessageLabel</class>
-   <extends>QWidget</extends>
-   <header>MessageLabel.hpp</header>
-   <container>1</container>
-  </customwidget>
  </customwidgets>
- <resources/>
+ <resources>
+  <include location="viewer.qrc"/>
+ </resources>
  <connections/>
 </ui>
diff --git a/Viewer/src/EditorInfoLabel.cpp b/Viewer/src/EditorInfoLabel.cpp
index 90d9ee6..96a77a6 100644
--- a/Viewer/src/EditorInfoLabel.cpp
+++ b/Viewer/src/EditorInfoLabel.cpp
@@ -41,7 +41,7 @@ EditorInfoLabel::EditorInfoLabel(QWidget* parent) : QLabel(parent)
 
 void EditorInfoLabel::setInfo(QString parent,QString type)
 {
-    setText(formatKeyLabel("Node: ") + formatNodePath(parent) + "<br>" +
+    setText(formatKeyLabel("Node path: ") + formatNodePath(parent) + "<br>" +
             formatKeyLabel("Attibute type: ") + type);
 }
 
diff --git a/Viewer/src/ExpandState.cpp b/Viewer/src/ExpandState.cpp
index 434e6df..d7abade 100644
--- a/Viewer/src/ExpandState.cpp
+++ b/Viewer/src/ExpandState.cpp
@@ -7,178 +7,389 @@
 // nor does it submit to any jurisdiction.
 //============================================================================
 
+#include "ExpandState.hpp"
 #include "ExpandStateNode.hpp"
+#include "AbstractNodeView.hpp"
+#include "ServerHandler.hpp"
 #include "TreeNodeModel.hpp"
+#include "UIDebug.hpp"
+#include "UiLog.hpp"
 #include "VNode.hpp"
 #include "VTree.hpp"
 
-template <typename View>
-ExpandState<View>::ExpandState(View * view,TreeNodeModel* model) :
+#include <boost/algorithm/string.hpp>
+
+//#define _UI_EXPANDSTATE_DEBUG
+
+ExpandState::ExpandState(AbstractNodeView* view,TreeNodeModel* model) :
     view_(view), model_(model), root_(0)
 {
 }
 
-template <typename View>
-ExpandState<View>::~ExpandState()
+ExpandState::~ExpandState()
 {
-	clear();
+    clear();
 }
 
-template <typename View>
-void ExpandState<View>::clear()
+void ExpandState::init(const VNode *vnode)
 {
-	if(root_)
-		delete root_;
+    clear();
 
-	root_=0;
+    ServerHandler* server=vnode->server();
+    Q_ASSERT(server);
+    QModelIndex idx=model_->serverToIndex(server);
+    bool expanded=view_->isExpanded(idx);
+
+    root_=new ExpandStateNode(server->vRoot(),expanded);
+
+    save(server->vRoot());
 }
 
-template <typename View>
-bool ExpandState<View>::rootSameAs(const std::string& name) const
+bool ExpandState::isEmpty() const
 {
-    return (root_ && root_->name_ == name);
+    return  !root_ || root_->children_.size() == 0;
 }
 
-template <typename View>
-ExpandStateNode* ExpandState<View>::setRoot(const std::string& name)
+void ExpandState::clear()
 {
-	if(root_)
-		clear();
+    if(root_)
+        delete root_;
 
-    root_=new ExpandStateNode(name);
-	return root_;
+    root_=0;
 }
 
 
-//Save the expand state for the given node (it can be a server as well)
-template <typename View>
-void ExpandState<View>::save(const VTreeNode *root)
+//Save the expand state for a whole subtree (it can be the whole VNode tree as well)
+void ExpandState::save(const VNode *vnode)
 {
-    assert(root);
+    UI_FUNCTION_LOG
+    UI_ASSERT(vnode,"");
+    UiLog().dbg() << " " << vnode->name();
 
-    clear();
+    if(!root_)
+    {
+        init(vnode);
+        Q_ASSERT(root_);
+        return;
+    }
+
+    if(ExpandStateNode* es=find(vnode->absNodePath()))
+    {
+        Q_ASSERT(root_);
+        QModelIndex idx=model_->nodeToIndex(vnode);
+
+        //It can happen that the VTree is empty but the server is already
+        //loaded. It is the situation when we load the same server in multiple
+        //tabs!!! We return here because there is nothing to save (and we would
+        //have a crash when trying to get index of the vnodes via the model!!)
+        if(VTreeNode* vtn=model_->indexToServerOrNode(idx))
+        {
+            if(VTree* vt=vtn->root())
+            {
+                if(vt->totalNum() == 0)
+                    return;
+            }
+        }
+
+        //save all the children recursively
+        save(vnode,es,idx);
+     }
+}
+
+#if 0
+//Save the expand state for a whole subtree (it can be the whole VNode tree as well)
+void ExpandState::save(const VNode *root)
+{    
+    UI_FUNCTION_LOG
+    UI_ASSERT(root,"");
+    UiLog().dbg() << " " << root->name();
 
     QModelIndex rootIdx=model_->nodeToIndex(root);
-    if(view_->isExpanded(rootIdx))
+    bool expanded=view_->isExpanded(rootIdx);
+    if(root_ == 0 || root_->name_ != root->strName())
     {
-        setRoot(root->vnode()->strName());
-        save(root_,rootIdx);
+        clear();
+        root_=new ExpandStateNode(root,expanded);
+    }
+    else
+    {
+        root_->expanded_=expanded;
+    }
+
+    //It can happen that the VTree is empty but the server is already
+    //loaded. It is the situation when we load the same server in multiple
+    //tabs!!! We return here because there is nothing to save (and we would
+    //have a crash when trying to get index of the vnodes via the model!!)
+    if(VTreeNode* vtn=model_->indexToServerOrNode(rootIdx))
+    {
+        if(VTree* vt=vtn->root())
+        {
+            if(vt->totalNum() == 0)
+                return;
+        }
     }
+
+    //save all the children recursively
+    save(root,root_,rootIdx);
 }
+#endif
 
-template <typename View>
-void ExpandState<View>::save(ExpandStateNode *parentExpand,const QModelIndex& parentIdx)
+//Save the expand state for the given node.
+//  node: the vnode to save
+//  expandNode: the expand node representing the vnode
+//  idx: the modelindex of the vnode in the TreeNodeModel. It can be invalid
+//       since the model can use a filter and its tree (the VTree) might represent only
+//       the subset of all the vnodes of a given server
+void ExpandState::save(const VNode *node,ExpandStateNode *expandNode,const QModelIndex& idx)
 {
-    for(int i=0; i < model_->rowCount(parentIdx); i++)
+    std::size_t numExpandNode=expandNode->children_.size();
+    std::size_t numNode=node->numOfChildren();
+
+    //the node and the expand node does not match. We clear the whole
+    //contents of the expand node
+    //CAN IT HAPPEN AT ALL??
+    if(numExpandNode != numNode || expandNode->name_ != node->strName())
+    {
+        UI_ASSERT(0,"numExpandNode=" << numExpandNode << " numNode=" << numNode <<
+                  " expandNode->name_=" << expandNode->name_ << " node->strName()=" <<
+                  node->strName());
+
+        expandNode->reset(node,view_->isExpanded(idx));
+        //At the this point the expand node children vector is
+        //reserved, but contains null pointers
+    }
+
+    for(std::size_t i=0; i < numNode; i++)
     {
-        QModelIndex chIdx=model_->index(i, 0, parentIdx);
+        VNode* chNode=node->childAt(i);
+        QModelIndex chIdx=model_->nodeToIndex(chNode);
+        ExpandStateNode* chExpandNode=expandNode->children_[i];
 
-        if(!view_->isExpanded(chIdx))
-            continue;
+        //The expand node exists
+        if(chExpandNode)
+        {
+            //We only set the expand state when the child node is in the current VTree (i.e. is filtered).
+            //Otherwise we keep the original value
+            if(chIdx.isValid())
+                chExpandNode->setExpanded(view_->isExpanded(chIdx));
+        }
+        // ... create a new child expand node at the i-th place
         else
         {
-            ExpandStateNode* expand=parentExpand->add(chIdx.data(Qt::DisplayRole).toString().toStdString());
-            save(expand,chIdx);
+            chExpandNode=expandNode->setChildAt(i,chNode,view_->isExpanded(chIdx));
         }
+
+        //save all the children recursively
+        save(chNode,chExpandNode,chIdx);
     }
 }
 
-//Save the expand state for the given node (it can be a server as well)
-template <typename View>
-void ExpandState<View>::restore(const VTreeNode* node)
+//Collect the modelindexes of the expanded nodes in a VNode subtree.
+//This is called after a server scan ended so the structure of the VNode tree and the
+//expand tree might not match. In this case the expand tree has to be adjusted to the
+//VNode tree.
+void ExpandState::collectExpanded(const VNode* node,QSet<QPersistentModelIndex>& theSet)
 {
+#ifdef _UI_EXPANDSTATE_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    Q_ASSERT(node);
+
     if(!root_)
         return;
 
-    if(node->vnode()->strName() != root_->name_)
+    QModelIndex nodeIdx=model_->nodeToIndex(node);
+#ifdef _UI_EXPANDSTATE_DEBUG
+    UiLog().dbg() << " root=" << root_->name_;
+#endif
+    ExpandStateNode *expand=find(node->absNodePath());
+    if(expand)
+        collectExpanded(expand,node,nodeIdx,theSet);
+    else
     {
-        clear();
-        return;
+#ifdef _UI_EXPANDSTATE_DEBUG
+        UiLog().dbg() << " Node not found in expand tree";
+#endif
     }
-
-    restore(root_,node);
-    clear();
 }
 
-template <typename View>
-void ExpandState<View>::restore(ExpandStateNode *expand,const VTreeNode* node)
+void ExpandState::collectExpanded(ExpandStateNode *expand,const VNode* node,const QModelIndex& nodeIdx,
+                                QSet<QPersistentModelIndex>& theSet)
 {
+#ifdef _UI_EXPANDSTATE_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    //The contents of expand node and the vnode might differ. We try to
+    //adjust the expand node to the vnode with this call.
+    bool adjusted=expand->adjustContents(node);
+
+    std::size_t numExpand=expand->children_.size();
+    std::size_t numNode=node->numOfChildren();
+
+    UI_ASSERT(numExpand==numNode,"node=" << node->strName() << " numExpand=" << numExpand <<
+              " numNode=" << numNode);
+
     //Lookup the node in the model
-    QModelIndex nodeIdx=model_->nodeToIndex(node);
-    if(nodeIdx != QModelIndex())
+    //QModelIndex nodeIdx=model_->nodeToIndex(node);
+    if(expand->expanded_ && nodeIdx.isValid())
     {
-        view_->setExpanded(nodeIdx,true);
+        theSet.insert(nodeIdx);
+
+#ifdef _UI_EXPANDSTATE_DEBUG
+        UiLog().dbg() << "  " << expand->name_;
+#endif
     }
-    else
+
+    //We need to see what to do with newly added nodes. We either expand
+    //all its children or leave it unexpanded. It depends on the expandedAll_
+    //flag set in any of the parents.
+    bool parentExpandedAll=false;
+    if(adjusted)
     {
-        return;
+        parentExpandedAll=needToExpandNewChild(expand,node->absNodePath());
     }
 
-    for(int i=0; i < expand->children_.size(); i++)
+    for(std::size_t i=0; i < numExpand; i++)
     {
-        ExpandStateNode *chExpand=expand->children_.at(i);
-        std::string name=chExpand->name_;
+        VNode *chNode=node->childAt(i);
+        UI_ASSERT(chNode,"");
+        QModelIndex chIdx=model_->nodeToIndex(chNode);
+        ExpandStateNode *chExpand=expand->children_[i];
 
-        if(VTreeNode *chNode=node->findChild(name))
+        //An existing expand node
+        if(chExpand)
         {
-            QModelIndex chIdx=model_->nodeToIndex(chNode);
-            if(chIdx != QModelIndex())
+            UI_ASSERT(chExpand->name_ == chNode->strName()," chExpand->name_=" << chExpand->name_ << " chNode->strName()=" << chNode->strName());
+        }
+
+        //A not-yet-allocated expand node. The corresponding vnode has just been
+        //added to the tree. We have to decide what to do with its expand state!!!
+        else
+        {
+            //create an expand node. Collapsed by default
+            chExpand=expand->setChildAt(i,chNode,0);
+
+            //save all the children recursively
+            save(chNode,chExpand,chIdx);
+
+            //expand recursively the new expand node if needed
+            if(parentExpandedAll)
+                chExpand->setExpandedRecursively(1);
+            else
             {
-                //setExpanded(chIdx,true);
-                restore(chExpand,chNode);
+                UiLog().dbg() << " newly added node not expanded!!";
             }
+
         }
+
+        collectExpanded(chExpand,chNode,chIdx,theSet);
     }
 }
 
-template <typename View>
-void ExpandState<View>::collectExpanded(const VTreeNode* node,QSet<QPersistentModelIndex>& theSet)
+
+void ExpandState::saveExpandAll(const VNode* node)
+{
+    UI_ASSERT(node,"");
+    if(ExpandStateNode* expand=find(node->absNodePath()))
+    {       
+        expand->setExpandedAll();
+    }
+}
+
+void ExpandState::saveCollapseAll(const VNode* node)
+{
+    UI_ASSERT(node,"");
+    if(ExpandStateNode* expand=find(node->absNodePath()))
+    {        
+        expand->setCollapsedAll();
+    }
+}
+
+//Find an expand node using its ful path
+ExpandStateNode* ExpandState::find(const std::string& fullPath)
 {
     if(!root_)
-        return;
+        return NULL;
+
+    if(fullPath.empty())
+        return NULL;
+
+    if(fullPath == "/")
+        return root_;
 
-    if(node->vnode()->strName() != root_->name_)
+    std::vector<std::string> pathVec;
+    boost::split(pathVec,fullPath,boost::is_any_of("/"));
+
+    if(pathVec.size() > 0 && pathVec[0].empty())
     {
-        clear();
-        return;
+        pathVec.erase(pathVec.begin());
     }
 
-    QModelIndex nodeIdx=model_->nodeToIndex(node);
-    collectExpanded(root_,node,nodeIdx,theSet);
-    clear();
+    return root_->find(pathVec);
 }
 
-
-template <typename View>
-void ExpandState<View>::collectExpanded(ExpandStateNode *expand,const VTreeNode* node,const QModelIndex& nodeIdx,
-                                QSet<QPersistentModelIndex>& theSet)
+bool ExpandState::needToExpandNewChild(ExpandStateNode* expandNode,const std::string& expandNodePath) const
 {
-    //Lookup the node in the model
-    //QModelIndex nodeIdx=model_->nodeToIndex(node);
-    if(nodeIdx != QModelIndex())
-    {
-        theSet.insert(nodeIdx);
-        //view_->setExpanded(nodeIdx,true);
-    }
-    else
+
+    if(expandNode->expandedAll_ ==  1)
+        return true;
+
+    if(expandNode->collapsedAll_ ==  1)
+        return false;
+
+    //Checks if any of the parents have expandedAll set. In this case we
+    //expand recursively all the new expand node
+    std::vector<ExpandStateNode*> parents;
+    collectParents(expandNodePath,parents);
+    for(std::vector<ExpandStateNode*>::reverse_iterator it=parents.rbegin();
+        it != parents.rend(); ++it)
     {
+        if((*it)->expandedAll_ ==  1)
+        {
+            return true;
+        }
+        else if((*it)->collapsedAll_ ==  1)
+        {
+            return false;
+        }
+     }
+     return false;
+}
+
+//We need to do it this way because we do not store the parents in the nodes for memory efficiency.
+void ExpandState::collectParents(const std::string& fullPath,std::vector<ExpandStateNode*>& parents) const
+{
+    if(!root_)
         return;
-    }
 
-    for(int i=0; i < expand->children_.size(); i++)
+    //how split works:
+    //  str="/"  -> "",""
+    //  str="/a" -> "","a"
+    //  str=" "  -> " "
+    //  str=""   -> ""
+
+    std::vector<std::string> pathVec;
+    boost::split(pathVec,fullPath,boost::is_any_of("/"));
+    if(pathVec.size() > 0 && pathVec[0].empty())
     {
-        ExpandStateNode *chExpand=expand->children_[i];
-        std::string name=chExpand->name_;
+        pathVec.erase(pathVec.begin());
+    }
 
-        if(VTreeNode *chNode=node->findChild(name))
-        {
-            QModelIndex chIdx=model_->nodeToIndex(chNode);
-            if(chIdx != QModelIndex())
-            {
-                //setExpanded(chIdx,true);
-                collectExpanded(chExpand,chNode,chIdx,theSet);
-            }
-        }
+    ExpandStateNode *p=root_;
+    std::size_t num=pathVec.size();
+    for(std::size_t i=0; i < num && p != 0; i++)
+    {
+        parents.push_back(p);
+        p=p->findChild(pathVec[i]);
     }
 }
 
+
+void ExpandState::print() const
+{
+    if(!root_)
+        return;
+
+    std::string indent="";
+    root_->print(indent,true);
+}
diff --git a/Viewer/src/ExpandState.hpp b/Viewer/src/ExpandState.hpp
index d4c3a1a..755e32d 100644
--- a/Viewer/src/ExpandState.hpp
+++ b/Viewer/src/ExpandState.hpp
@@ -12,48 +12,54 @@
 #define EXPANDSTATE_HPP_
 
 #include <string>
+#include <vector>
 
 #include <QPersistentModelIndex>
+#include <QSet>
+
+//Represents the expand state of a full/part VNode tree. This tree has the same structure
+//as a VNode tree and each VNode object is represented by a ExpandStateNode object.
 
 class TreeNodeModel;
+class AbstractNodeView;
 class QModelIndex;
-class VTreeNode;
+class VNode;
 class ExpandStateNode;
 
-template <typename View> class ExpandState;
-
-template <typename View>
 class ExpandState
 {
     friend class TreeNodeView;
     friend class CompactNodeView;
 
 public:
-    explicit ExpandState(View*,TreeNodeModel*);
+    ExpandState(AbstractNodeView*,TreeNodeModel*);
     ~ExpandState();
 
-    bool rootSameAs(const std::string&) const;
-    void save(const VTreeNode*);
-    void restore(const VTreeNode*);
-
-    void collectExpanded(const VTreeNode* node,QSet<QPersistentModelIndex>&);
+    void save(const VNode*);
+    void collectExpanded(const VNode* node,QSet<QPersistentModelIndex>&);
+    void saveExpandAll(const VNode* node);
+    void saveCollapseAll(const VNode* node);
+    void print() const;
+    bool isEmpty() const;
 
 protected:
+    void init(const VNode *vnode);
 	void clear();
-    ExpandStateNode* setRoot(const std::string&);
     ExpandStateNode* root() const {return root_;}
-    void save(ExpandStateNode*,const QModelIndex&);
-    void restore(ExpandStateNode*,const VTreeNode*);
-    void collectExpanded(ExpandStateNode *expand,const VTreeNode* node,
+    void save(const VNode *,ExpandStateNode*,const QModelIndex&);
+    void collectExpanded(ExpandStateNode *expand,const VNode* node,
                  const QModelIndex& nodeIdx,QSet<QPersistentModelIndex>& theSet);
 
-    View* view_;
+    bool needToExpandNewChild(ExpandStateNode* expandNode,const std::string&) const;
+    void collectParents(const std::string& fullPath,std::vector<ExpandStateNode*>& parents) const;
+
+    ExpandStateNode* find(const std::string& fullPath);
+
+    AbstractNodeView* view_;
     TreeNodeModel* model_;
     ExpandStateNode* root_;
 };
 
-#include "ExpandState.cpp"
-
 #endif
 
 
diff --git a/Viewer/src/ExpandStateNode.cpp b/Viewer/src/ExpandStateNode.cpp
index b13cdd5..c2ad296 100644
--- a/Viewer/src/ExpandStateNode.cpp
+++ b/Viewer/src/ExpandStateNode.cpp
@@ -8,26 +8,224 @@
 //============================================================================
 
 #include "ExpandStateNode.hpp"
+#include "UIDebug.hpp"
+#include "UiLog.hpp"
+#include "VNode.hpp"
 
+ExpandStateNode::ExpandStateNode(const VNode* node,bool expanded) :
+    expanded_(expanded),
+    expandedAll_(0),
+    collapsedAll_(0)
+{
+    name_=node->strName();
+    reserveChildren(node->numOfChildren());
+}
 
 ExpandStateNode::~ExpandStateNode()
 {
     clear();
 }
 
+//Clear the contents and create a new children vector
+//with NULLs!
+void ExpandStateNode::reset(const VNode* node,bool expanded)
+{
+    clear();
+    name_=node->strName();
+    expanded_=expanded;
+    expandedAll_=0;
+    collapsedAll_=0;
+    reserveChildren(node->numOfChildren());
+}
+
 void ExpandStateNode::clear()
 {
     name_.clear();
+    expanded_=0;
+    expandedAll_=0;
+    collapsedAll_=0;
     for(unsigned int i=0; i < children_.size(); i++)
     {
         delete children_.at(i);
     }
-    children_.clear();
+    children_=std::vector<ExpandStateNode*>();
+}
+
+//Create new children vector filled with NULLs
+void ExpandStateNode::reserveChildren(std::size_t num)
+{
+    UI_ASSERT(children_.size() == 0,"children_.size()=" << children_.size());
+
+    ExpandStateNode *exn=0;
+    children_=std::vector<ExpandStateNode*>();
+    children_.resize(num,exn);
+}
+
+//Allocate a new child and place it into then children vector at the specified position
+ExpandStateNode* ExpandStateNode::setChildAt(std::size_t index,VNode* node,bool expanded)
+{
+    ExpandStateNode *exn=new ExpandStateNode(node,expanded);
+    children_[index]=exn;
+    return exn;
+}
+
+//"Expand all children" was called on the node
+void ExpandStateNode::setExpandedAll()
+{
+    expandedAll_=1;
+    collapsedAll_=0;
+    //Set the expand state on all the descendants
+    std::size_t num=children_.size();
+    for(std::size_t i=0; i < num; i++)
+        children_[i]->setExpandedRecursively(1);
+}
+
+//"Collapse all children" was called on the node
+void ExpandStateNode::setCollapsedAll()
+{
+    expandedAll_=0;
+    collapsedAll_=1;
+    //Set the expand state on all the descendants
+    std::size_t num=children_.size();
+    for(std::size_t i=0; i < num; i++)
+        children_[i]->setExpandedRecursively(0);
+}
+
+void ExpandStateNode::setExpandedRecursively(unsigned int expanded)
+{   
+    expanded_=expanded;
+    expandedAll_=0;
+    collapsedAll_=0;
+    std::size_t num=children_.size();
+    for(std::size_t i=0; i < num; i++)
+    {       
+        children_[i]->setExpandedRecursively(expanded);
+    }
 }
 
-ExpandStateNode* ExpandStateNode::add(const std::string& name)
+//Find a descendant
+ExpandStateNode* ExpandStateNode::find(const std::vector<std::string>& pathVec)
 {
-    ExpandStateNode *n=new ExpandStateNode(name);
-    children_.push_back(n);
-    return n;
+    if(pathVec.size() == 0)
+        return this;
+
+    if(pathVec.size() == 1)
+    {
+        return findChild(pathVec.at(0));
+    }
+
+    std::vector<std::string> rest(pathVec.begin()+1,pathVec.end());
+    ExpandStateNode*n = findChild(pathVec.at(0));
+
+    return n?n->find(rest):NULL;
 }
+
+//Find a child with the given name
+ExpandStateNode* ExpandStateNode::findChild(const std::string& theName) const
+{
+    std::size_t num=children_.size();
+    for(std::size_t i=0; i < num; i++)
+    {
+        //A child can be NULL temporarily
+        if(children_[i] && children_[i]->name_ == theName)
+            return children_[i];
+    }
+    return 0;
+}
+
+//Find a child with the given name. Returns its position as well.
+ExpandStateNode* ExpandStateNode::findChild(const std::string& theName,std::size_t& pos) const
+{
+    pos=-1;
+    std::size_t num=children_.size();
+    for(std::size_t i=0; i < num; i++)
+    {
+        //A child can be NULL temporarily
+        if(children_[i] && children_[i]->name_ == theName)
+        {
+            pos=i;
+            return children_[i];
+        }
+    }
+    return 0;
+}
+
+void ExpandStateNode::print(std::string& indent,bool recursive) const
+{
+    UiLog().dbg() << indent <<  name_ << " " << expanded_;
+    if(recursive)
+    {
+        indent+="  ";
+        std::size_t num=children_.size();
+        for(std::size_t i=0; i < num; i++)
+            children_[i]->print(indent,true);
+
+        indent=indent.substr(0,indent.size()-2);
+    }
+}
+
+//Adjust the contents of the given expand node to the contents of the vnode it
+//represents. Return true if an adjustment was actually needed.
+bool ExpandStateNode::adjustContents(const VNode* node)
+{
+    std::size_t numExpand=children_.size();
+    std::size_t numNode=node->numOfChildren();
+
+    //Check if the children of the expand node and the vnode are the same.
+    //They migh differ when:
+    //  -the order of the nodes changed
+    //  -nodes were added/removed
+    bool same=false;
+    if(numExpand == numNode)
+    {
+        same=true;
+        for(std::size_t i=0; i < numNode; i++)
+        {          
+            //items in children can be null pointers
+            if(!children_[i] || children_[i]->name_ != node->childAt(i)->strName())
+            {
+                same=false;
+                break;
+            }
+        }
+    }
+
+    //the children of the expand node and the vnode are not the same!!!
+    if(!same)
+    {
+        //create a new children vector for the expand node and
+        //copy all the expand children into it whose name appear in the
+        //vnode children
+        std::vector<ExpandStateNode*> chVec;
+        for(std::size_t i=0; i < numNode; i++)
+        {
+            std::size_t chPos=-1;
+            if(ExpandStateNode* chExpand=findChild(node->childAt(i)->strName(),chPos))
+            {
+                chVec.push_back(chExpand);
+                children_[chPos]=0;
+            }
+            else
+                chVec.push_back(0);
+        }
+
+        //Delete the children vector of the expand node. It eaither contains NULLs or
+        //children objects which do not exist anymore!
+        for(std::size_t i=0; i < numExpand; i++)
+        {
+            if(children_[i] != 0)
+                delete children_[i];
+        }
+
+        children_.clear();
+
+        //reassign the children vector to the expand node
+        children_=chVec;
+     }
+
+    return !same;
+}
+
+
+
+
diff --git a/Viewer/src/ExpandStateNode.hpp b/Viewer/src/ExpandStateNode.hpp
index 8e0d576..3b29c9a 100644
--- a/Viewer/src/ExpandStateNode.hpp
+++ b/Viewer/src/ExpandStateNode.hpp
@@ -14,22 +14,52 @@
 #include <string>
 #include <vector>
 
+class VNode;
+
+//Store the expanded state of a node between major updates, server clears,
+//status filter changes etc... Each VNode is represented by an ExpandStateNode!
+//Note: for memory efficiency we do not store the parent!!!
 class ExpandStateNode
 {
-    friend class TreeNodeView;
-    friend class CompactNodeView;
+    friend class ExpandState;
 
 public:
-    explicit ExpandStateNode(const std::string& name) : name_(name) {}
-    ExpandStateNode() : name_("") {}
+    explicit ExpandStateNode(const VNode* node,bool);
     ~ExpandStateNode();
 
+    void reset(const VNode* node,bool expanded);
     void clear();
-    ExpandStateNode* add(const std::string&);
+    ExpandStateNode* setChildAt(std::size_t index,VNode* node,bool
+                                expanded);
+    void setExpanded(bool expanded) {expanded_=expanded;}
+    void setExpandedRecursively(unsigned int expanded);
+    void setExpandedAll();
+    void setCollapsedAll();
+
+    ExpandStateNode* find(const std::vector<std::string>& pathVec);
+    ExpandStateNode* findChild(const std::string& name) const;
+    ExpandStateNode* findChild(const std::string& name,std::size_t& pos) const;
+    bool adjustContents(const VNode* node);
+    void print(std::string& indent,bool recursive) const;
+
+protected:
+    void reserveChildren(std::size_t num);
 
     std::vector<ExpandStateNode*> children_;
     std::string name_;
 
+    //Set if the node is expanded
+    unsigned int expanded_: 1;
+
+    //Set if "Expand all children" was called on the node.
+    //Cleared when "collaps all children" is called on this node or
+    //on an ancestor
+    unsigned int expandedAll_ : 1;
+
+    //Set if "Collaps all children" was called on the node
+    //Cleared when "expand all children" is called on this node or
+    //on an ancestor
+    unsigned int collapsedAll_ : 1;
 };
 
 #endif // EXPANDSTATENODE_HPP
diff --git a/Viewer/src/FilterWidget.cpp b/Viewer/src/FilterWidget.cpp
index b61bdfa..dbcad45 100644
--- a/Viewer/src/FilterWidget.cpp
+++ b/Viewer/src/FilterWidget.cpp
@@ -160,7 +160,6 @@ void VParamFilterMenu::buildTitle(QString title,QMenu* parent)
 	titleLabel->setAlignment(Qt::AlignHCenter);
 	titleLabel->setAutoFillBackground(true);
 	QPalette pal=titleLabel->palette();
-	QColor winCol=menu_->palette().color(QPalette::Window);
 	pal.setColor(QPalette::Window,QColor(237,238,238));
 	titleLabel->setPalette(pal);
 
diff --git a/Viewer/src/HistoryItemWidget.cpp b/Viewer/src/HistoryItemWidget.cpp
index f65c6e6..385f6b4 100644
--- a/Viewer/src/HistoryItemWidget.cpp
+++ b/Viewer/src/HistoryItemWidget.cpp
@@ -9,6 +9,10 @@
 
 #include "HistoryItemWidget.hpp"
 
+#include <QtGlobal>
+#include <QAction>
+#include <QClipboard>
+
 #include "LogProvider.hpp"
 #include "LogModel.hpp"
 #include "VReply.hpp"
@@ -31,8 +35,13 @@ HistoryItemWidget::HistoryItemWidget(QWidget *parent) : QWidget(parent)
 	treeView_->setProperty("log","1");
 	treeView_->setModel(model_);
 	treeView_->setItemDelegate(new LogDelegate(this));
+    treeView_->setContextMenuPolicy(Qt::ActionsContextMenu);
 
     checkActionState();
+
+    //Define context menu
+    treeView_->addAction(actionCopyEntry_);
+    treeView_->addAction(actionCopyRow_);
 }
 
 QWidget* HistoryItemWidget::realWidget()
@@ -152,5 +161,27 @@ void HistoryItemWidget::on_reloadTb__clicked(bool)
 	}
 }
 
+void HistoryItemWidget::on_actionCopyEntry__triggered()
+{
+   toClipboard(model_->entryText(treeView_->currentIndex()));
+}
+
+void HistoryItemWidget::on_actionCopyRow__triggered()
+{
+   toClipboard(model_->fullText(treeView_->currentIndex()));
+}
+
+void HistoryItemWidget::toClipboard(QString txt) const
+{
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+    QClipboard* cb=QGuiApplication::clipboard();
+    cb->setText(txt, QClipboard::Clipboard);
+    cb->setText(txt, QClipboard::Selection);
+#else
+    QClipboard* cb=QApplication::clipboard();
+    cb->setText(txt, QClipboard::Clipboard);
+    cb->setText(txt, QClipboard::Selection);
+#endif
+}
 
 static InfoPanelItemMaker<HistoryItemWidget> maker1("history");
diff --git a/Viewer/src/HistoryItemWidget.hpp b/Viewer/src/HistoryItemWidget.hpp
index 905e32c..da4bb2a 100644
--- a/Viewer/src/HistoryItemWidget.hpp
+++ b/Viewer/src/HistoryItemWidget.hpp
@@ -40,14 +40,17 @@ public:
     void defsChanged(const std::vector<ecf::Aspect::Type>&) {}
 
 protected Q_SLOTS:
-	void on_reloadTb__clicked(bool);
+    void on_reloadTb__clicked(bool);
+    void on_actionCopyEntry__triggered();
+    void on_actionCopyRow__triggered();
 
 protected:
     void updateState(const ChangeFlags&);
     void adjustColumnSize();
     void checkActionState();
+    void toClipboard(QString txt) const;
 
-	LogModel* model_;
+    LogModel* model_;
 };
 
 #endif
diff --git a/Viewer/src/HistoryItemWidget.ui b/Viewer/src/HistoryItemWidget.ui
index a61c96d..c5f3bd8 100644
--- a/Viewer/src/HistoryItemWidget.ui
+++ b/Viewer/src/HistoryItemWidget.ui
@@ -17,7 +17,16 @@
    <property name="spacing">
     <number>1</number>
    </property>
-   <property name="margin">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
     <number>0</number>
    </property>
    <item>
@@ -110,18 +119,38 @@
     <widget class="PlainTextSearchLine" name="searchLine_" native="true"/>
    </item>
   </layout>
+  <action name="actionCopyEntry_">
+   <property name="text">
+    <string>Copy text of &Entry</string>
+   </property>
+   <property name="toolTip">
+    <string>Copy text of the log entry</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+C</string>
+   </property>
+  </action>
+  <action name="actionCopyRow_">
+   <property name="text">
+    <string>Copy text of full &row</string>
+   </property>
+   <property name="toolTip">
+    <string>Copy text of full row</string>
+   </property>
+  </action>
  </widget>
  <customwidgets>
   <customwidget>
-   <class>PlainTextSearchLine</class>
+   <class>MessageLabel</class>
    <extends>QWidget</extends>
-   <header>PlainTextSearchLine.hpp</header>
+   <header location="global">MessageLabel.hpp</header>
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>FileInfoLabel</class>
-   <extends>QLabel</extends>
-   <header location="global">FileInfoLabel.hpp</header>
+   <class>PlainTextSearchLine</class>
+   <extends>QWidget</extends>
+   <header>PlainTextSearchLine.hpp</header>
+   <container>1</container>
   </customwidget>
   <customwidget>
    <class>TreeView</class>
@@ -129,10 +158,9 @@
    <header location="global">TreeView.hpp</header>
   </customwidget>
   <customwidget>
-   <class>MessageLabel</class>
-   <extends>QWidget</extends>
-   <header>MessageLabel.hpp</header>
-   <container>1</container>
+   <class>FileInfoLabel</class>
+   <extends>QLabel</extends>
+   <header location="global">FileInfoLabel.hpp</header>
   </customwidget>
  </customwidgets>
  <resources>
diff --git a/Viewer/src/IconProvider.cpp b/Viewer/src/IconProvider.cpp
index fe4f68e..5dd2526 100644
--- a/Viewer/src/IconProvider.cpp
+++ b/Viewer/src/IconProvider.cpp
@@ -15,6 +15,8 @@
 #include <QImageReader>
 #include <QPainter>
 
+#include "UiLog.hpp"
+
 static UnknownIconItem unknownIcon(":/desktop/unknown.svg");
 static IconItem linkIcon(":/desktop/link.svg");
 static IconItem linkBrokenIcon(":/desktop/link_broken.svg");
@@ -81,7 +83,6 @@ QPixmap UnknownIconItem::unknown(int size)
 	return QPixmap();
 }
 
-
 //===========================================
 //
 // IconProvider
diff --git a/Viewer/src/IconProvider.hpp b/Viewer/src/IconProvider.hpp
index 7bb2a58..040f054 100644
--- a/Viewer/src/IconProvider.hpp
+++ b/Viewer/src/IconProvider.hpp
@@ -22,11 +22,10 @@ public:
     virtual ~IconItem() {}
 
 	QPixmap pixmap(int);
-	int id () const {return id_;}
+    int id () const {return id_;}
 	QString path() const {return path_;}
 
 protected:
-  	static void greyOut(QImage &);
   	virtual QPixmap unknown(int);
 
   	QString path_;
diff --git a/Viewer/src/InfoPanel.cpp b/Viewer/src/InfoPanel.cpp
index 18fd151..56a55f0 100644
--- a/Viewer/src/InfoPanel.cpp
+++ b/Viewer/src/InfoPanel.cpp
@@ -78,6 +78,13 @@ InfoPanel::InfoPanel(QWidget* parent) :
 	actionFrozen_->setChecked(false);
 
     WidgetNameProvider::nameChildren(this);
+
+    //Create the handler for all the possible panels!
+    for(std::vector<InfoPanelDef*>::const_iterator it=InfoPanelHandler::instance()->panels().begin();
+        it != InfoPanelHandler::instance()->panels().end(); ++it)
+    {
+        createHandler(*it);
+    }
 }
 
 InfoPanel::~InfoPanel()
@@ -358,7 +365,7 @@ void InfoPanel::adjustTabs(VInfo_ptr info)
 	InfoPanelItem* currentItem=findItem(current);
 
 	//A new set of tabs is needed!
-	if(tab_->count() != ids.size() || match != ids.size())
+    if(tab_->count() != static_cast<int>(ids.size()) || match != static_cast<int>(ids.size()))
 	{
 		//We set this flag true so that the change of the current tab should not
 		//trigger a reload! We want to reload the current tab only after the
@@ -427,8 +434,8 @@ InfoPanelItem* InfoPanel::findItem(QWidget* w)
 
 	Q_FOREACH(InfoPanelItemHandler *d,items_)
 	{
-			if(d->widget() == w)
-					return d->item();
+        if(d->widget() == w)
+            return d->item();
 	}
 
 	return 0;
@@ -441,8 +448,8 @@ InfoPanelItemHandler* InfoPanel::findHandler(QWidget* w)
 
 	Q_FOREACH(InfoPanelItemHandler *d,items_)
 	{
-			if(d->widget() == w)
-					return d;
+        if(d->widget() == w)
+            return d;
 	}
 
 	return 0;
@@ -452,8 +459,8 @@ InfoPanelItemHandler* InfoPanel::findHandler(InfoPanelDef* def)
 {
 	Q_FOREACH(InfoPanelItemHandler *d,items_)
 	{
-			if(d->def() == def)
-				return d;
+        if(d->def() == def)
+            return d;
 	}
 
 	return createHandler(def);
@@ -574,6 +581,16 @@ void InfoPanel::updateTitle()
     }
 }
 
+void InfoPanel::relayInfoPanelCommand(VInfo_ptr info,QString cmd)
+{
+    Q_EMIT popInfoPanel(info,cmd);
+}
+
+void InfoPanel::relayDashboardCommand(VInfo_ptr info,QString cmd)
+{
+    Q_EMIT dashboardCommand(info,cmd);
+}
+
 void InfoPanel::notifyDataLost(VInfo* info)
 {
 	if(info_ && info_.get() == info)
@@ -687,7 +704,7 @@ void InfoPanel::notifyServerSuiteFilterChanged(ServerHandler* server)
 	if(frozen())
 		return;
 
-	if(info_.get())
+    if(info_)
 	{
 		if(info_->server() && info_->server() == server)
 		{
@@ -700,13 +717,13 @@ void InfoPanel::notifyServerSuiteFilterChanged(ServerHandler* server)
 	}
 }
 
-void InfoPanel::notifyServerSyncFinished(ServerHandler* server)
+void InfoPanel::notifyEndServerSync(ServerHandler* server)
 {
 	//TODO: does frozen make sense in this case?
 	if(frozen())
 		return;
 
-	if(info_.get())
+    if(info_)
 	{
 		if(info_->server() && info_->server() == server)
 		{
@@ -724,7 +741,7 @@ void InfoPanel::rerender()
 	bcWidget_->rerender();
 }
 
-void InfoPanel::writeSettings(VSettings* vs)
+void InfoPanel::writeSettings(VComboSettings* vs)
 {
 	vs->put("type",type_);
 	vs->put("dockId",id_);
@@ -742,7 +759,7 @@ void InfoPanel::writeSettings(VSettings* vs)
     }
 }
 
-void InfoPanel::readSettings(VSettings* vs)
+void InfoPanel::readSettings(VComboSettings* vs)
 {
 	std::string type=vs->get<std::string>("type","");
 	if(type != type_)
diff --git a/Viewer/src/InfoPanel.hpp b/Viewer/src/InfoPanel.hpp
index f536e2b..b85da54 100644
--- a/Viewer/src/InfoPanel.hpp
+++ b/Viewer/src/InfoPanel.hpp
@@ -59,6 +59,8 @@ public:
     void clear();
 	void setCurrent(const std::string& name);
     void linkSelected(VInfo_ptr);
+    void relayInfoPanelCommand(VInfo_ptr info,QString cmd);
+    void relayDashboardCommand(VInfo_ptr info,QString cmd);
 
     void populateDialog();
 
@@ -66,8 +68,8 @@ public:
     void populateDockTitleBar(DashboardDockTitleWidget*);
     void reload() {}
 	void rerender();
-    void writeSettings(VSettings*);
-	void readSettings(VSettings*);
+    void writeSettings(VComboSettings*);
+    void readSettings(VComboSettings*);
     void writeSettingsForDialog();
     void readSettingsForDialog();
 
@@ -84,7 +86,7 @@ public:
 	void notifyEndServerScan(ServerHandler* server);
 	void notifyServerConnectState(ServerHandler* server);
 	void notifyServerSuiteFilterChanged(ServerHandler* server);
-	void notifyServerSyncFinished(ServerHandler* server);
+    void notifyEndServerSync(ServerHandler* server);
 
 public Q_SLOTS:
 	void slotReload(VInfo_ptr node);
diff --git a/Viewer/src/InfoPanelItem.cpp b/Viewer/src/InfoPanelItem.cpp
index 903cee5..d539feb 100644
--- a/Viewer/src/InfoPanelItem.cpp
+++ b/Viewer/src/InfoPanelItem.cpp
@@ -247,7 +247,7 @@ void InfoPanelItem::setDetached(bool b)
 
 void InfoPanelItem::linkSelected(const std::string& path)
 {
-    if(!suspended_ && !detached_)
+    if(!suspended_)
     {
         VInfo_ptr info=VInfo::createFromPath(info_->server(),path);
 
@@ -259,6 +259,36 @@ void InfoPanelItem::linkSelected(const std::string& path)
     }
 }
 
+void InfoPanelItem::linkSelected(VInfo_ptr info)
+{
+    if(!suspended_)
+    {
+        if(info)
+        {
+            assert(owner_);
+            owner_->linkSelected(info);
+        }
+    }
+}
+
+void InfoPanelItem::relayInfoPanelCommand(VInfo_ptr info,QString cmd)
+{
+    if(info)
+    {
+        assert(owner_);
+        owner_->relayInfoPanelCommand(info,cmd);
+    }
+}
+
+void InfoPanelItem::relayDashboardCommand(VInfo_ptr info,QString cmd)
+{
+    if(info)
+    {
+        assert(owner_);
+        owner_->relayDashboardCommand(info,cmd);
+    }
+}
+
 //From NodeObserver
 void InfoPanelItem::notifyBeginNodeChange(const VNode* node, const std::vector<ecf::Aspect::Type>& aspect,const VNodeChange&)
 {
@@ -269,9 +299,15 @@ void InfoPanelItem::notifyBeginNodeChange(const VNode* node, const std::vector<e
     if(info_)
 	{
 		if(info_->isNode())
-		{
-			//Check if the updated node is handled by the item
-            if(info_->node() == node ||
+		{                
+            //Check if updates are handled when unselected
+            if(!selected_ && !unselectedFlags_.isSet(KeepContents))
+            {
+                return;
+            }
+
+            //Check if the updated node is handled by the item
+            if(handleAnyChange_ || info_->node() == node ||
               (useAncestors_ && info_->node()->isAncestor(node)))
             {
 			    //We call the method implemented in the concrete class 
diff --git a/Viewer/src/InfoPanelItem.hpp b/Viewer/src/InfoPanelItem.hpp
index 4b4b306..782d816 100644
--- a/Viewer/src/InfoPanelItem.hpp
+++ b/Viewer/src/InfoPanelItem.hpp
@@ -18,13 +18,16 @@
 #include "VTaskObserver.hpp"
 
 #include <string>
+#include <QString>
 
 class QWidget;
 class InfoPanel;
 class InfoProvider;
-class VSettings;
+class VComboSettings;
 
 //This is the (abstract) base class to represent one tab in the info panel.
+//It cannot be inheried from QObject beacuse we would end up with double inheritance since
+//all the derived calsses are inherited from QObject!!
 
 class InfoPanelItem : public VTaskObserver, public InfoPresenter, public NodeObserver
 {
@@ -33,7 +36,7 @@ friend class InfoPanel;
 public:
     InfoPanelItem() : owner_(0), active_(false), selected_(false), suspended_(false),
                       frozen_(false), detached_(false), unselectedFlags_(KeepContents),
-                      useAncestors_(false) {}
+                      useAncestors_(false),handleAnyChange_(false) {}
 	virtual ~InfoPanelItem();
 
     enum ChangeFlag {ActiveChanged=1,SelectedChanged=2,SuspendedChanged=4,FrozenChanged=8,DetachedChanged=16};
@@ -71,14 +74,18 @@ public:
 	void notifyBeginNodeChange(const VNode*, const std::vector<ecf::Aspect::Type>&,const VNodeChange&);
 	void notifyEndNodeChange(const VNode*, const std::vector<ecf::Aspect::Type>&,const VNodeChange&) {}
 
-    virtual void writeSettings(VSettings* vs) {}
-    virtual void readSettings(VSettings* vs) {}
+    virtual void writeSettings(VComboSettings* vs) {}
+    virtual void readSettings(VComboSettings* vs) {}
 
 protected:
 	void adjust(VInfo_ptr);
+    void linkSelected(const std::string& path);
+    void linkSelected(VInfo_ptr);
+    void relayInfoPanelCommand(VInfo_ptr info,QString cmd);
+    void relayDashboardCommand(VInfo_ptr info,QString cmd);
+
     virtual void clear();
     virtual void updateState(const ChangeFlags&)=0;
-    void linkSelected(const std::string& path);
 
 	//Notifications about the server changes
 	virtual void defsChanged(const std::vector<ecf::Aspect::Type>&)=0;
@@ -97,6 +104,7 @@ protected:
     bool detached_;
     UnselectedFlags unselectedFlags_;
     bool useAncestors_;
+    bool handleAnyChange_;
 };
 
 class InfoPanelItemFactory
diff --git a/Viewer/src/JobItemWidget.cpp b/Viewer/src/JobItemWidget.cpp
index b682d90..a5a29d4 100644
--- a/Viewer/src/JobItemWidget.cpp
+++ b/Viewer/src/JobItemWidget.cpp
@@ -22,7 +22,8 @@ JobItemWidget::JobItemWidget(QWidget *parent) : CodeItemWidget(parent)
 	//Remove the first spacer item!!
 	removeSpacer();
 
-	Highlighter* ih=new Highlighter(textEdit_->document(),"job");
+    //The document becomes the owner of the highlighter
+    new Highlighter(textEdit_->document(),"job");
 
     infoProvider_=new JobProvider(this);
 
diff --git a/Viewer/src/LogModel.cpp b/Viewer/src/LogModel.cpp
index a2baba2..6bb3024 100644
--- a/Viewer/src/LogModel.cpp
+++ b/Viewer/src/LogModel.cpp
@@ -168,7 +168,6 @@ QVariant LogModel::data( const QModelIndex& index, int role ) const
 	if(row < 0 || row >= data_.size())
 		return QVariant();
 
-
 	if(role == Qt::DisplayRole)
 	{
 		switch(index.column())
@@ -243,6 +242,35 @@ QVariant LogModel::data( const QModelIndex& index, int role ) const
 
 		return f;
 	}
+
+    else if(role == Qt::ToolTipRole)
+    {
+        QString txt="<b>Type: </b>";
+        switch(data_.at(row).type_)
+        {
+            case LogModelLine::MessageType:
+                    txt +="MSG ";
+                    break;
+            case LogModelLine::LogType:
+                    txt +="LOG ";
+                    break;
+            case LogModelLine::ErrorType:
+                    txt +="ERR ";
+                    break;
+            case LogModelLine::WarningType:
+                    txt +="WAR ";
+                    break;
+            case LogModelLine::DebugType:
+                    txt +="DBG ";
+            default:
+                    break;
+        }
+
+        txt+="<br><b>Date: </b>" + data_.at(row).date_;
+        txt+="<br><b>Entry: </b>" + data_.at(row).entry_;
+        return txt;
+    }
+
 	/*else if(role == Qt::SizeHintRole)
 	{
 		QFont f;
@@ -310,6 +338,18 @@ QModelIndex LogModel::lastIndex() const
 	return index(rowCount()-1,0);
 }
 
+QString LogModel::entryText(const QModelIndex &idx) const
+{
+    return data(index(idx.row(),2)).toString();
+}
+
+QString LogModel::fullText(const QModelIndex &idx) const
+{
+    return data(index(idx.row(),0)).toString() + " " +
+           data(index(idx.row(),1)).toString() + " " +
+           data(index(idx.row(),2)).toString();
+}
+
 //========================================================
 //
 // LogDelegate
diff --git a/Viewer/src/LogModel.hpp b/Viewer/src/LogModel.hpp
index 5038b81..1b50046 100644
--- a/Viewer/src/LogModel.hpp
+++ b/Viewer/src/LogModel.hpp
@@ -52,6 +52,9 @@ public:
     void clearData();
     QModelIndex lastIndex() const;
 
+    QString entryText(const QModelIndex&) const;
+    QString fullText(const QModelIndex&) const;
+
 protected:
 	QList<LogModelLine> data_;
 };
diff --git a/Viewer/src/LogProvider.cpp b/Viewer/src/LogProvider.cpp
index 37bfe4c..2000051 100644
--- a/Viewer/src/LogProvider.cpp
+++ b/Viewer/src/LogProvider.cpp
@@ -8,18 +8,19 @@
 //
 //============================================================================
 
+#include <fstream>
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/algorithm/string/predicate.hpp>
 #include "LogProvider.hpp"
 
 #include "FileWatcher.hpp"
 #include "VNode.hpp"
 #include "VReply.hpp"
 #include "ServerHandler.hpp"
+#include "File.hpp"
 
-#include <fstream>
-
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
-#include <boost/algorithm/string/predicate.hpp>
 
 LogProvider::LogProvider(InfoPresenter* owner,QObject* parent) :
 	QObject(parent),
@@ -108,9 +109,9 @@ void LogProvider::fetchFile(ServerHandler *server,const std::string& fileName)
     //First we try to read the file directly from the disk
     //if(server->readFromDisk())
     {
-    	size_t size;
+    	size_t file_size = 0;
     	std::string err_msg;
-    	reply_->text(readLastLines(fileName,100,size,err_msg));
+    	reply_->text( ecf::File::get_last_n_lines(fileName,100,file_size,err_msg));
     	if(err_msg.empty())
     	{
     		reply_->fileReadMode(VReply::LocalReadMode);
@@ -121,7 +122,7 @@ void LogProvider::fetchFile(ServerHandler *server,const std::string& fileName)
     		owner_->infoReady(reply_);
 
     		//Try to track the changes in the log file
-    		watchFile(fileName,size);
+    		watchFile(fileName,file_size);
     		return;
     	}
     }
@@ -194,49 +195,3 @@ void LogProvider::slotLinesAppend(QStringList lst)
 	owner_->infoAppended(reply_);
 }
 
-std::string LogProvider::readLastLines(const std::string& filename,int last_n_lines,size_t& size,std::string& error_msg)
-{
-   if ( last_n_lines <= 0  ) return std::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 std::string();
-   }
-
-   size_t const granularity = 100 * last_n_lines;
-   source.seekg( 0, std::ios_base::end );
-   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 );
-#if defined(HPUX) || defined(_AIX)
-       source.read( &(buffer.front()), buffer.size() );
-#else
-       source.read( buffer.data(), buffer.size() );
-#endif
-       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() );
-}
-
-
-
-
-
-
-
-
diff --git a/Viewer/src/LogProvider.hpp b/Viewer/src/LogProvider.hpp
index db9e991..c404316 100644
--- a/Viewer/src/LogProvider.hpp
+++ b/Viewer/src/LogProvider.hpp
@@ -25,27 +25,25 @@ class FileWatcher;
 
 class LogProvider : public QObject, public InfoProvider
 {
-  Q_OBJECT
+   Q_OBJECT
 
 public:
-	 LogProvider(InfoPresenter* owner,QObject* parent=0);
+   LogProvider(InfoPresenter* owner,QObject* parent=0);
 
-	 void visit(VInfoServer*);
-	 void clear();
-     void setAutoUpdate(bool);
+   void visit(VInfoServer*);
+   void clear();
+   void setAutoUpdate(bool);
 
-public Q_SLOTS:
-	void slotLinesAppend(QStringList);
+   public Q_SLOTS:
+   void slotLinesAppend(QStringList);
 
-private:
-	void fetchFile();
-	void fetchFile(ServerHandler *server,const std::string& fileName);
-	void watchFile(const std::string&,size_t);
-	void stopWatchFile();
-	std::string readLastLines(const std::string& filename,int last_n_lines,size_t& size,std::string& error_msg);
-
-    FileWatcher* fileWatcher_;
+   private:
+   void fetchFile();
+   void fetchFile(ServerHandler *server,const std::string& fileName);
+   void watchFile(const std::string&,size_t);
+   void stopWatchFile();
 
+   FileWatcher* fileWatcher_;
 };
 
 #endif
diff --git a/Viewer/src/MainWindow.cpp b/Viewer/src/MainWindow.cpp
index e787c9c..a2f1049 100644
--- a/Viewer/src/MainWindow.cpp
+++ b/Viewer/src/MainWindow.cpp
@@ -24,6 +24,7 @@
 #include "MainWindow.hpp"
 
 #include "AboutDialog.hpp"
+#include "ChangeNotify.hpp"
 #include "ChangeNotifyWidget.hpp"
 #include "FilterWidget.hpp"
 #include "InfoPanel.hpp"
@@ -32,12 +33,15 @@
 #include "NodePathWidget.hpp"
 #include "NodePanel.hpp"
 #include "PropertyDialog.hpp"
+#include "PropertyMapper.hpp"
+#include "ServerComInfoWidget.hpp"
 #include "ServerHandler.hpp"
 #include "ServerList.hpp"
 #include "ServerListDialog.hpp"
 #include "ServerListSyncWidget.hpp"
 #include "SessionHandler.hpp"
 #include "SaveSessionAsDialog.hpp"
+#include "ToolTipFormat.hpp"
 #include "UiLog.hpp"
 #include "VConfig.hpp"
 #include "VIcon.hpp"
@@ -63,7 +67,9 @@ MainWindow::MainWindow(QStringList idLst,QWidget *parent) :
 
     setAttribute(Qt::WA_DeleteOnClose);
 
-    constructWindowTitle();
+    //the window title
+    winTitle_=new MainWindowTitleHandler(this);
+    winTitle_->update();
 
     //Create the main layout
     QVBoxLayout* layout=new QVBoxLayout();
@@ -83,35 +89,45 @@ MainWindow::MainWindow(QStringList idLst,QWidget *parent) :
     connect(nodePanel_,SIGNAL(currentWidgetChanged()),
     		this,SLOT(slotCurrentChangedInPanel()));
 
-    connect(nodePanel_,SIGNAL(selectionChanged(VInfo_ptr)),
+    connect(nodePanel_,SIGNAL(selectionChangedInCurrent(VInfo_ptr)),
     			this,SLOT(slotSelectionChanged(VInfo_ptr)));
 
     connect(nodePanel_,SIGNAL(contentsChanged()),
-    	    this,SLOT(slotContentsChanged()));
+            this,SLOT(slotContentsChanged()));
 
-    //Add temporary preview label
-   /* QLabel *label=new QLabel(" This is a preview version and has not been verified for operational use! ",this);
-    label->setAutoFillBackground(true);
-    label->setProperty("previewLabel","1");
+    //--------------
+    // Toolbar
+    //--------------
 
-    QLabel *label1=new QLabel("      ",this);
+    //Add server refresh widget to the front of the toolbar
+    serverComWidget_=new ServerRefreshInfoWidget(actionRefreshSelected,this);
+    Q_ASSERT(actionSearch);
+    viewToolBar->insertWidget(actionSearch,serverComWidget_);
+    //viewToolBar->addWidget(serverComWidget_);
 
-    viewToolBar->addWidget(label1);
-    viewToolBar->addWidget(label);*/
+    connect(serverComWidget_,SIGNAL(serverSettingsEditRequested(ServerHandler*)),
+            this,SLOT(slotEditServerSettings(ServerHandler*)));
 
+
+    //insert a spacer after the the server refresh widget
     QWidget* spacer = new QWidget();
     spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    //viewToolBar->insertWidget(actionSearch,spacer);
     viewToolBar->addWidget(spacer);
 
-    //QToolBar* ipToolBar=new QToolBar(this);
-    addInfoPanelActions(viewToolBar);
-    //addToolBar(ipToolBar);
+    //Add more actions
+    addInfoPanelActions(viewToolBar);  
+
+    //Add shortcuts to action tooltips
+    Viewer::addShortCutToToolTip(viewToolBar->actions());
 
-    //Actions based on selection
+    //Initialise actions based on selection
     actionRefreshSelected->setEnabled(false);
     actionResetSelected->setEnabled(false);
 
+    //--------------
     //Status bar
+    //--------------
 
     //Add server list sync notification
     if(ServerList::instance()->hasSyncChange())
@@ -133,6 +149,9 @@ MainWindow::MainWindow(QStringList idLst,QWidget *parent) :
     ChangeNotifyWidget* chw=new ChangeNotifyWidget(this);
     statusBar()->addPermanentWidget(chw);
 
+    //serverComWidget_=new ServerComLineDisplay(this);
+    //statusBar()->addPermanentWidget(serverComWidget_);
+
     //Assigns name to each object
     WidgetNameProvider::nameChildren(this);
 
@@ -142,7 +161,8 @@ MainWindow::MainWindow(QStringList idLst,QWidget *parent) :
 MainWindow::~MainWindow()
 {
     UiLog().dbg() << "MainWindow --> desctutor";
-	serverFilterMenu_->aboutToDestroy();
+    delete winTitle_;
+    serverFilterMenu_->aboutToDestroy();
 }
 
 void MainWindow::init(MainWindow *win)
@@ -175,24 +195,6 @@ void MainWindow::addInfoPanelActions(QToolBar *toolbar)
    }
 }
 
-
-void MainWindow::constructWindowTitle()
-{
-    char *userTitle = getenv("ECFUI_TITLE");
-    std::string mainTitle = (userTitle != NULL) ? std::string(userTitle) + " (" + ecf::Version::raw() + ")"
-                                                : VConfig::instance()->appLongName();
-
-    // add the name of the session to the title bar?
-    std::string sessionName = SessionHandler::instance()->current()->name();
-    if (sessionName == "default")
-        sessionName = "";
-    else
-        sessionName = " (session: " + sessionName + ")";
-
-    setWindowTitle(QString::fromStdString(mainTitle) + "  -  Preview version" + QString::fromStdString(sessionName));
-}
-
-
 //==============================================================
 //
 //  File menu
@@ -253,20 +255,7 @@ void MainWindow::on_actionResetSelected_triggered()
 
 void MainWindow::on_actionPreferences_triggered()
 {
-    PropertyDialog* d=new PropertyDialog; //belongs to the whole app
-
-    connect(d,SIGNAL(configChanged()),
-    		this,SLOT(slotConfigChanged()));
-
-	if(d->exec() == QDialog::Accepted)
-	{
-		if(d->isConfigChanged())
-		{
-			configChanged(this);
-		}
-    }
-
-	delete d;
+    startPreferences(this,"");
 }
 
 void MainWindow::on_actionManageSessions_triggered()
@@ -295,6 +284,11 @@ void MainWindow::on_actionSearch_triggered()
     nodePanel_->addSearchDialog();
 }
 
+void MainWindow::on_actionNotification_triggered()
+{
+    ChangeNotify::showDialog();
+}
+
 void MainWindow::on_actionManageServers_triggered()
 {
 	ServerListDialog dialog(ServerListDialog::SelectionMode,nodePanel_->serverFilter(),this);
@@ -316,10 +310,6 @@ void MainWindow::on_actionAddInfoPanel_triggered()
 	nodePanel_->addToDashboard("info");
 }
 
-void MainWindow::on_actionShowInInfoPanel_triggered()
-{
-}
-
 void MainWindow::on_actionAbout_triggered()
 {
     AboutDialog d;
@@ -332,7 +322,6 @@ void MainWindow::on_actionSaveSessionAs_triggered()
     d.exec();
 }
 
-
 void MainWindow::slotCurrentChangedInPanel()
 {
 	slotSelectionChanged(nodePanel_->currentSelection());
@@ -348,13 +337,16 @@ void MainWindow::slotCurrentChangedInPanel()
 	 //updateSearchPanel();
 }
 
+//The selection changed in one of the views
 void MainWindow::slotSelectionChanged(VInfo_ptr info)
 {
-	selection_=info;
+    selection_=info;
 
+    //Get the set of visible info panel tabs for the selection
 	std::vector<InfoPanelDef*> ids;
 	InfoPanelHandler::instance()->visible(selection_,ids);
 
+    //Set status of the info panel actions in the toolbar accordingly
 	Q_FOREACH(QAction* ac,infoPanelActions_)
 	{
 		ac->setEnabled(false);
@@ -371,24 +363,29 @@ void MainWindow::slotSelectionChanged(VInfo_ptr info)
 		}
 	}
 
+    //Update the refres action/info to the selection
 	updateRefreshActions();
 }
 
 void MainWindow::updateRefreshActions()
 {
-	QString serverName;
-	if(selection_ && selection_.get())
+    ServerHandler* s=0;
+
+    QString serverName;
+    if(selection_)
 	{
-		if(ServerHandler* s=selection_->server())
-		{
-			serverName=QString::fromStdString(s->name());
-		}
+        s=selection_->server();
 	}
 
-	bool hasSel=(selection_ && selection_.get());
+    serverComWidget_->setServer(s);
+
+
+    bool hasSel=(selection_!= 0);
 	actionRefreshSelected->setEnabled(hasSel);
 	actionResetSelected->setEnabled(hasSel);
 
+#if 0
+
 	if(serverName.isEmpty())
 	{
 		QString tnew=tr("Refresh <b>selected</b> server<br>") +
@@ -406,7 +403,8 @@ void MainWindow::updateRefreshActions()
 
 			actionRefreshSelected->setToolTip(tnew);
 		}
-	}
+    }
+#endif
 }
 
 
@@ -459,6 +457,12 @@ void MainWindow::hideServerSyncNotify()
       serverSyncNotifyTb_->hide();
 }
 
+void MainWindow::slotEditServerSettings(ServerHandler* s)
+{
+    VInfo_ptr info=VInfoServer::create(s);
+    nodePanel_->openDialog(info,"server_settings");
+}
+
 //==============================================================
 //
 //  Close and quit
@@ -503,7 +507,11 @@ void MainWindow::writeSettings(VComboSettings *vs)
 	//Qt settings
 	vs->putQs("geometry",saveGeometry());
 	vs->putQs("state",saveState());
-	vs->putQs("minimized",(windowState() & Qt::WindowMinimized)?1:0);
+
+//See ECFLOW-1090
+#if 0
+    vs->putQs("minimized",(windowState() & Qt::WindowMinimized)?1:0);
+#endif
 
 	//Other setting
 	vs->put("infoPanelCount",findChildren<QDockWidget*>().count());
@@ -522,10 +530,13 @@ void MainWindow::readSettings(VComboSettings *vs)
 
 	nodePanel_->readSettings(vs);
 
+    //See ECFLOW-1090
+#if 0
 	if(vs->getQs("minimized").toInt()== 1)
 	{
 	  	setWindowState(windowState() | Qt::WindowMinimized);
 	}
+#endif
 
 	if(vs->containsQs("geometry"))
 		restoreGeometry(vs->getQs("geometry").toByteArray());
@@ -814,8 +825,83 @@ MainWindow* MainWindow::findWindow(QWidget *childW)
 	return 0;
 }
 
+void MainWindow::startPreferences(QString option)
+{
+    if(windows_.count() > 0)
+        startPreferences(windows_.front(),option);
+}
+
+void MainWindow::startPreferences(MainWindow *w,QString option)
+{
+    Q_ASSERT(w);
+
+    PropertyDialog* d=new PropertyDialog; //belongs to the whole app
 
+    d->showPage(option);
+
+    connect(d,SIGNAL(configChanged()),
+        w,SLOT(slotConfigChanged()));
+
+    if(d->exec() == QDialog::Accepted)
+    {
+        if(d->isConfigChanged())
+        {
+            configChanged(w);
+        }
+    }
+
+    delete d;
+}
+
+
+//--------------------------------------------------------
+//
+// MainWindowTitle (class to handle the MainWindow title)
+//
+//--------------------------------------------------------
 
+MainWindowTitleHandler::MainWindowTitleHandler(QMainWindow *win) : win_(win)
+{
+    Q_ASSERT(win_);
+    std::vector<std::string> propVec;
+    propVec.push_back("menu.access.nodeMenuMode");
+    prop_=new PropertyMapper(propVec,this);
+}
+
+MainWindowTitleHandler::~MainWindowTitleHandler()
+{
+    delete prop_;
+}
+
+void MainWindowTitleHandler::notifyChange(VProperty*)
+{
+    update();
+}
+
+void MainWindowTitleHandler::update()
+{
+    Q_ASSERT(win_);
+
+    char *userTitle = getenv("ECFUI_TITLE");
+    std::string mainTitle = (userTitle != NULL) ? std::string(userTitle) + " (" + ecf::Version::raw() + ")"
+                                                : VConfig::instance()->appLongName();
+
+    QString title=QString::fromStdString(mainTitle);
+
+    if(VProperty* p=prop_->find("menu.access.nodeMenuMode"))
+    {
+        QString menuMode=p->valueLabel();
+        if(!menuMode.isEmpty())
+            title+=" - (menu: " + menuMode + ")";
+    }
+
+    // add the name of the session to the title bar?
+    QString sessionName = QString::fromStdString(SessionHandler::instance()->current()->name());
+    if (sessionName != "default")
+        title+= " - (session: " + sessionName + ")";
+
+    win_->setWindowTitle(title);
+}
 
 
 
diff --git a/Viewer/src/MainWindow.hpp b/Viewer/src/MainWindow.hpp
index 6d81f09..6303d68 100644
--- a/Viewer/src/MainWindow.hpp
+++ b/Viewer/src/MainWindow.hpp
@@ -16,6 +16,7 @@
 #include "ui_MainWindow.h"
 
 #include "VInfo.hpp"
+#include "VProperty.hpp"
 
 #include <boost/property_tree/ptree.hpp>
 
@@ -24,9 +25,24 @@ class QLabel;
 class QToolButton;
 class InfoPanel;
 class NodePanel;
+class ServerRefreshInfoWidget;
 class ServerFilterMenu;
 class SessionItem;
 class VComboSettings;
+class PropertyMapper;
+
+class MainWindowTitleHandler : public VPropertyObserver
+{
+public:
+   MainWindowTitleHandler(QMainWindow*);
+   ~MainWindowTitleHandler();
+   void update();
+   void notifyChange(VProperty*);
+
+protected:
+   QMainWindow* win_;
+   PropertyMapper* prop_;
+};
 
 class MainWindow : public QMainWindow, private Ui::MainWindow
 {
@@ -43,6 +59,7 @@ public:
     static void reload();
     static void saveSession(SessionItem*);
     static void changeNotifySelectionChanged(VInfo_ptr);
+    static void startPreferences(QString);
 
 protected Q_SLOTS:
 	void on_actionNewTab_triggered();
@@ -55,12 +72,12 @@ protected Q_SLOTS:
 	void on_actionResetSelected_triggered();
 	void on_actionConfigureNodeMenu_triggered();
 	void on_actionManageServers_triggered();
-	void on_actionShowInInfoPanel_triggered();
 	void on_actionAddTreeWidget_triggered();
 	void on_actionAddTableWidget_triggered();
 	void on_actionAddInfoPanel_triggered();
 	void on_actionPreferences_triggered();
 	void on_actionSearch_triggered();
+    void on_actionNotification_triggered();
 	void on_actionAbout_triggered();
 	void on_actionSaveSessionAs_triggered();
 	void on_actionManageSessions_triggered();
@@ -71,6 +88,7 @@ protected Q_SLOTS:
 	void slotConfigChanged();
 	void slotContentsChanged();
     void slotServerSyncNotify(bool);
+    void slotEditServerSettings(ServerHandler* s);
 
 private:
     void init(MainWindow*);
@@ -81,7 +99,6 @@ private:
     bool selectInTreeView(VInfo_ptr info);
     void updateRefreshActions();
     void hideServerSyncNotify();
-    void constructWindowTitle();
     void cleanUpOnQuit();
 
     void writeSettings(VComboSettings*);
@@ -99,12 +116,15 @@ private:
     static void configChanged(MainWindow *);
     static void hideServerSyncNotify(MainWindow*);
     static void cleanUpOnQuit(MainWindow *);
+    static void startPreferences(MainWindow *,QString);
 
     ServerFilterMenu* serverFilterMenu_;
     NodePanel* nodePanel_;
     QList<QAction*> infoPanelActions_;
     VInfo_ptr selection_;
     QToolButton* serverSyncNotifyTb_;
+    ServerRefreshInfoWidget *serverComWidget_;
+    MainWindowTitleHandler* winTitle_;
 
     static bool quitStarted_;
     static QList<MainWindow*> windows_;
diff --git a/Viewer/src/MainWindow.ui b/Viewer/src/MainWindow.ui
index e14e630..f943ccb 100644
--- a/Viewer/src/MainWindow.ui
+++ b/Viewer/src/MainWindow.ui
@@ -60,16 +60,6 @@
     <addaction name="actionClose"/>
     <addaction name="actionQuit"/>
    </widget>
-   <widget class="QMenu" name="menuEdit">
-    <property name="tearOffEnabled">
-     <bool>true</bool>
-    </property>
-    <property name="title">
-     <string>&Edit</string>
-    </property>
-    <addaction name="actionPreferences"/>
-    <addaction name="actionConfigureNodeMenu"/>
-   </widget>
    <widget class="QMenu" name="menuHelp">
     <property name="tearOffEnabled">
      <bool>true</bool>
@@ -84,38 +74,39 @@
      <bool>true</bool>
     </property>
     <property name="title">
-     <string>&Servers</string>
+     <string>Ser&vers</string>
     </property>
     <addaction name="actionManageServers"/>
     <addaction name="separator"/>
    </widget>
    <widget class="QMenu" name="menuView">
     <property name="title">
-     <string>&View</string>
+     <string>&Panels</string>
     </property>
     <addaction name="actionAddTreeWidget"/>
     <addaction name="actionAddTableWidget"/>
     <addaction name="actionAddInfoPanel"/>
-    <addaction name="actionAddLogPanel"/>
    </widget>
    <widget class="QMenu" name="menuTools">
     <property name="title">
      <string>&Tools</string>
     </property>
     <addaction name="actionSearch"/>
+    <addaction name="actionNotification"/>
+    <addaction name="separator"/>
+    <addaction name="actionPreferences"/>
    </widget>
    <widget class="QMenu" name="menuRefresh">
     <property name="title">
      <string>&Refresh</string>
     </property>
+    <addaction name="actionRefreshSelected"/>
+    <addaction name="actionRefresh"/>
+    <addaction name="separator"/>
     <addaction name="actionReset"/>
     <addaction name="actionResetSelected"/>
-    <addaction name="separator"/>
-    <addaction name="actionRefresh"/>
-    <addaction name="actionRefreshSelected"/>
    </widget>
    <addaction name="menuFile"/>
-   <addaction name="menuEdit"/>
    <addaction name="menuView"/>
    <addaction name="menuRefresh"/>
    <addaction name="menuServer"/>
@@ -128,7 +119,7 @@
     <string>View toolbar</string>
    </property>
    <property name="movable">
-    <bool>true</bool>
+    <bool>false</bool>
    </property>
    <property name="allowedAreas">
     <set>Qt::AllToolBarAreas</set>
@@ -139,7 +130,6 @@
    <attribute name="toolBarBreak">
     <bool>false</bool>
    </attribute>
-   <addaction name="actionRefreshSelected"/>
    <addaction name="actionSearch"/>
    <addaction name="actionManageServers"/>
   </widget>
@@ -193,10 +183,6 @@
    </property>
   </action>
   <action name="actionRefresh">
-   <property name="icon">
-    <iconset resource="viewer.qrc">
-     <normaloff>:/viewer/reload.svg</normaloff>:/viewer/reload.svg</iconset>
-   </property>
    <property name="text">
     <string>Refresh all servers  &in tab</string>
    </property>
@@ -208,10 +194,6 @@
    </property>
   </action>
   <action name="actionReset">
-   <property name="icon">
-    <iconset resource="viewer.qrc">
-     <normaloff>:/viewer/reset.svg</normaloff>:/viewer/reset.svg</iconset>
-   </property>
    <property name="text">
     <string>&Reset all servers in tab</string>
    </property>
@@ -244,7 +226,7 @@
     <string>&Manage servers ...</string>
    </property>
    <property name="toolTip">
-    <string>Manage servers<br><code>Ctrl+N</code></string>
+    <string>Manage servers</string>
    </property>
    <property name="shortcut">
     <string>Ctrl+N</string>
@@ -265,7 +247,7 @@
      <normaloff>:/viewer/images/add_tree.svg</normaloff>:/viewer/images/add_tree.svg</iconset>
    </property>
    <property name="text">
-    <string>&Add tree view</string>
+    <string>Add &tree view panel</string>
    </property>
    <property name="toolTip">
     <string>Add tree widget</string>
@@ -277,7 +259,7 @@
      <normaloff>:/viewer/images/add_table.svg</normaloff>:/viewer/images/add_table.svg</iconset>
    </property>
    <property name="text">
-    <string>Add table &view</string>
+    <string>Add ta&ble view panel</string>
    </property>
    <property name="toolTip">
     <string>Add table widget</string>
@@ -288,14 +270,6 @@
     <string>&About EcflowUI ...</string>
    </property>
   </action>
-  <action name="actionAddLogPanel">
-   <property name="enabled">
-    <bool>false</bool>
-   </property>
-   <property name="text">
-    <string>Add &log panel</string>
-   </property>
-  </action>
   <action name="actionManageSessions">
    <property name="enabled">
     <bool>true</bool>
@@ -319,7 +293,7 @@
   <action name="actionRefreshSelected">
    <property name="icon">
     <iconset resource="viewer.qrc">
-     <normaloff>:/viewer/reload_one.svg</normaloff>:/viewer/reload_one.svg</iconset>
+     <normaloff>:/viewer/reload_green.svg</normaloff>:/viewer/reload_green.svg</iconset>
    </property>
    <property name="text">
     <string>R&efresh selected server</string>
@@ -344,6 +318,18 @@
     <bool>false</bool>
    </property>
   </action>
+  <action name="actionNotification">
+   <property name="icon">
+    <iconset resource="viewer.qrc">
+     <normaloff>:/viewer/notification.svg</normaloff>:/viewer/notification.svg</iconset>
+   </property>
+   <property name="text">
+    <string>&Notifications ...</string>
+   </property>
+   <property name="toolTip">
+    <string>Notifications</string>
+   </property>
+  </action>
  </widget>
  <resources>
   <include location="viewer.qrc"/>
diff --git a/Viewer/src/ManualItemWidget.cpp b/Viewer/src/ManualItemWidget.cpp
index 6400cf4..d459566 100644
--- a/Viewer/src/ManualItemWidget.cpp
+++ b/Viewer/src/ManualItemWidget.cpp
@@ -22,7 +22,8 @@ ManualItemWidget::ManualItemWidget(QWidget *parent) : CodeItemWidget(parent)
     messageLabel_->hide();
     textEdit_->setShowLineNumbers(false);
 
-    Highlighter* ih=new Highlighter(textEdit_->document(),"manual");
+    //The document becomes the owner of the highlighter
+    new Highlighter(textEdit_->document(),"manual");
 
     infoProvider_=new ManualProvider(this);
 
diff --git a/Viewer/src/MenuHandler.cpp b/Viewer/src/MenuHandler.cpp
index 43ea32b..0bc90a2 100644
--- a/Viewer/src/MenuHandler.cpp
+++ b/Viewer/src/MenuHandler.cpp
@@ -28,10 +28,12 @@
 #include "Str.hpp"
 #include "MenuHandler.hpp"
 #include "ServerHandler.hpp"
+#include "UIDebug.hpp"
 #include "UiLog.hpp"
 #include "UserMessage.hpp"
 #include "VConfig.hpp"
 #include "VNode.hpp"
+#include "VProperty.hpp"
 #include "CustomCommandHandler.hpp"
 
 int MenuItem::idCnt_=0;
@@ -136,6 +138,7 @@ bool MenuHandler::readMenuConfigFile(const std::string &configFile)
                 std::string visible  = ItemDef.get("visible_for", "");
                 std::string questFor = ItemDef.get("question_for","");
                 std::string question = ItemDef.get("question", "");
+                std::string questionControl = ItemDef.get("question_control", "");
                 std::string handler  = ItemDef.get("handler", "");
                 std::string views    = ItemDef.get("view", "");
                 std::string icon     = ItemDef.get("icon", "");
@@ -176,6 +179,7 @@ bool MenuHandler::readMenuConfigFile(const std::string &configFile)
 
 
                 item->setQuestion(question);
+                item->setQuestionControl(questionControl);
                 item->setHandler(handler);
                 item->setIcon(icon);
                 item->setStatustip(statustip);
@@ -488,6 +492,19 @@ void MenuHandler::interceptCommandsThatNeedConfirmation(MenuItem *item)
 	}
 }
 
+QString MenuHandler::nodeMenuMode()
+{
+    static VProperty* p=0;
+    if(!p)
+    {
+        p=VConfig::instance()->find("menu.access.nodeMenuMode");
+        UI_ASSERT(p!=0,"");
+        if(!p)
+            return QString();
+    }
+    return p->value().toString();
+}
+
 
 // -----------------------------------------------------------------
 
@@ -695,7 +712,6 @@ void Menu::buildMenuTitle(std::vector<VInfo_ptr> nodes, QMenu* qmenu)
 				int lighter=150;
 				QColor bg=bgBrush.color();
 				QColor bgLight=bg.lighter(lighter);
-				QColor border=bg.darker(125);
 
 				QLinearGradient grad;
 				grad.setCoordinateMode(QGradient::ObjectBoundingMode);
diff --git a/Viewer/src/MenuHandler.hpp b/Viewer/src/MenuHandler.hpp
index f658912..22782a1 100644
--- a/Viewer/src/MenuHandler.hpp
+++ b/Viewer/src/MenuHandler.hpp
@@ -46,6 +46,7 @@ public:
     void setHandler(const std::string &handler);
     void setViews(const std::vector<std::string> &views) {views_=views;}
     void setQuestion(const std::string &question) {question_=question;}
+    void setQuestionControl(const std::string &questionControl) {questionControl_=questionControl;}
     void setIcon(const std::string &icon);
     void setStatustip(const std::string &statustip) {statustip_=statustip;}
     void setHidden(bool b) {hidden_=b;}
@@ -66,6 +67,7 @@ public:
     bool isValidView(const std::string&) const;
     const std::string& command() const {return command_;}
     const std::string& question() const {return question_;}
+    const std::string& questionControl() const {return questionControl_;}
     bool hidden() const {return hidden_;}
     int id() const {return id_;}
     QAction* createAction(QWidget* parent);
@@ -83,6 +85,7 @@ private:
     std::string command_;
     std::string statustip_;
     std::string question_;
+    std::string questionControl_;
     std::string defaultAnswer_;
     std::string handler_;
     std::vector<std::string> views_;
@@ -156,9 +159,10 @@ public:
     static bool addItemToMenu(MenuItem *item, const std::string &menuName);
     static Menu *findMenu(const std::string &name);    
     static MenuItem* newItem(const std::string &name);
-    static void addMenu(Menu *menu) {menus_.push_back(menu);};
+    static void addMenu(Menu *menu) {menus_.push_back(menu);}
     static void interceptCommandsThatNeedConfirmation(MenuItem *item);
     static void refreshCustomMenuCommands();
+    static QString nodeMenuMode();
 
 private:
     typedef std::map<std::string, std::string> ConfirmationMap;
diff --git a/Viewer/src/MessageItemWidget.cpp b/Viewer/src/MessageItemWidget.cpp
index e32ae3b..5a099d4 100644
--- a/Viewer/src/MessageItemWidget.cpp
+++ b/Viewer/src/MessageItemWidget.cpp
@@ -9,6 +9,10 @@
 
 #include "MessageItemWidget.hpp"
 
+#include <QtGlobal>
+#include <QAction>
+#include <QClipboard>
+
 #include "InfoProvider.hpp"
 #include "VReply.hpp"
 
@@ -31,8 +35,13 @@ MessageItemWidget::MessageItemWidget(QWidget *parent) : QWidget(parent)
     treeView_->setProperty("log","1");
     treeView_->setModel(model_);
     treeView_->setItemDelegate(new LogDelegate(this));
+    treeView_->setContextMenuPolicy(Qt::ActionsContextMenu);
 
     syncTb_->hide();
+
+    //Define context menu
+    treeView_->addAction(actionCopyEntry_);
+    treeView_->addAction(actionCopyRow_);
 }
 
 QWidget* MessageItemWidget::realWidget()
@@ -87,4 +96,27 @@ void MessageItemWidget::infoFailed(VReply* reply)
     QString s=QString::fromStdString(reply->errorText());
 }
 
+void MessageItemWidget::on_actionCopyEntry__triggered()
+{
+   toClipboard(model_->entryText(treeView_->currentIndex()));
+}
+
+void MessageItemWidget::on_actionCopyRow__triggered()
+{
+   toClipboard(model_->fullText(treeView_->currentIndex()));
+}
+
+void MessageItemWidget::toClipboard(QString txt) const
+{
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+    QClipboard* cb=QGuiApplication::clipboard();
+    cb->setText(txt, QClipboard::Clipboard);
+    cb->setText(txt, QClipboard::Selection);
+#else
+    QClipboard* cb=QApplication::clipboard();
+    cb->setText(txt, QClipboard::Clipboard);
+    cb->setText(txt, QClipboard::Selection);
+#endif
+}
+
 static InfoPanelItemMaker<MessageItemWidget> maker1("message");
diff --git a/Viewer/src/MessageItemWidget.hpp b/Viewer/src/MessageItemWidget.hpp
index 33b8888..866a1df 100644
--- a/Viewer/src/MessageItemWidget.hpp
+++ b/Viewer/src/MessageItemWidget.hpp
@@ -19,6 +19,7 @@ class LogModel;
 
 class MessageItemWidget : public QWidget, public InfoPanelItem, protected Ui::MessageItemWidget
 {
+    Q_OBJECT
 public:
 	explicit MessageItemWidget(QWidget *parent=0);
 
@@ -34,10 +35,15 @@ public:
     void nodeChanged(const VNode*, const std::vector<ecf::Aspect::Type>&) {}
     void defsChanged(const std::vector<ecf::Aspect::Type>&) {}
 
+protected Q_SLOTS:
+    void on_actionCopyEntry__triggered();
+    void on_actionCopyRow__triggered();
+
 protected:
-    void updateState(const ChangeFlags&) {}
-	LogModel* model_;
+    void updateState(const ChangeFlags&) {}	
+    void toClipboard(QString txt) const;
 
+    LogModel* model_;
 };
 
 #endif
diff --git a/Viewer/src/MessageItemWidget.ui b/Viewer/src/MessageItemWidget.ui
index d6653ef..22e7d73 100644
--- a/Viewer/src/MessageItemWidget.ui
+++ b/Viewer/src/MessageItemWidget.ui
@@ -17,7 +17,16 @@
    <property name="spacing">
     <number>1</number>
    </property>
-   <property name="margin">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
     <number>0</number>
    </property>
    <item>
@@ -47,7 +56,7 @@
         <string>...</string>
        </property>
        <property name="icon">
-        <iconset>
+        <iconset resource="viewer.qrc">
          <normaloff>:/viewer/search_decor.svg</normaloff>:/viewer/search_decor.svg</iconset>
        </property>
        <property name="shortcut">
@@ -70,7 +79,7 @@
         <string>...</string>
        </property>
        <property name="icon">
-        <iconset>
+        <iconset resource="viewer.qrc">
          <normaloff>:/viewer/sync.svg</normaloff>:/viewer/sync.svg</iconset>
        </property>
        <property name="autoRaise">
@@ -103,6 +112,25 @@
     <widget class="PlainTextSearchLine" name="searchLine_" native="true"/>
    </item>
   </layout>
+  <action name="actionCopyEntry_">
+   <property name="text">
+    <string>Copy text of &Entry</string>
+   </property>
+   <property name="toolTip">
+    <string>Copy text of the log entry</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+C</string>
+   </property>
+  </action>
+  <action name="actionCopyRow_">
+   <property name="text">
+    <string>Copy text of full &row</string>
+   </property>
+   <property name="toolTip">
+    <string>Copy text of full row</string>
+   </property>
+  </action>
  </widget>
  <customwidgets>
   <customwidget>
@@ -123,6 +151,8 @@
    <header location="global">TreeView.hpp</header>
   </customwidget>
  </customwidgets>
- <resources/>
+ <resources>
+  <include location="viewer.qrc"/>
+ </resources>
  <connections/>
 </ui>
diff --git a/Viewer/src/MessageLabel.cpp b/Viewer/src/MessageLabel.cpp
index 404be74..f3e852d 100644
--- a/Viewer/src/MessageLabel.cpp
+++ b/Viewer/src/MessageLabel.cpp
@@ -50,8 +50,8 @@ static std::map<MessageLabel::Type,MessageLabelData> typeData;
 MessageLabel::MessageLabel(QWidget *parent) :
 	QWidget(parent),
     showTypeTitle_(true),
-    currentType_(NoType),
-    narrowMode_(false)
+    narrowMode_(false),
+    currentType_(NoType)
 {
 	setProperty("base","1");
 
diff --git a/Viewer/src/ModelColumn.cpp b/Viewer/src/ModelColumn.cpp
index bcff5a5..627fa75 100644
--- a/Viewer/src/ModelColumn.cpp
+++ b/Viewer/src/ModelColumn.cpp
@@ -70,3 +70,4 @@ ModelColumnItem::ModelColumnItem(const std::string& id) : index_(-1)
 static SimpleLoader<ModelColumn> loaderQuery("query_columns");
 static SimpleLoader<ModelColumn> loaderTable("table_columns");
 static SimpleLoader<ModelColumn> loaderZombie("zombie_columns");
+static SimpleLoader<ModelColumn> loaderTriggerGraph("trigger_graph_columns");
diff --git a/Viewer/src/NodeExpression.cpp b/Viewer/src/NodeExpression.cpp
index c47ba5d..1183dbd 100644
--- a/Viewer/src/NodeExpression.cpp
+++ b/Viewer/src/NodeExpression.cpp
@@ -17,6 +17,7 @@
 #include "Submittable.hpp"
 
 #include "NodeExpression.hpp"
+#include "MenuHandler.hpp"
 #include "ServerHandler.hpp"
 #include "UiLog.hpp"
 #include "VAttribute.hpp"
@@ -95,7 +96,7 @@ VAttributeType* NodeExpressionParser::toAttrType(const std::string &name) const
     return NULL;
 }
 
-bool NodeExpressionParser::isUserLevel(const std::string &str) const
+bool NodeExpressionParser::isMenuMode(const std::string &str) const
 {
     if (str == "oper" || str == "admin")
         return true;
@@ -286,10 +287,10 @@ BaseNodeCondition *NodeExpressionParser::parseExpression(bool caseSensitiveStrin
                     updatedOperands = true;
                 }
 
-                // user level
-                else if (isUserLevel(*i_))
+                // node mneu mode
+                else if (isMenuMode(*i_))
                 {
-                    UserLevelCondition *userCond = new UserLevelCondition(QString::fromStdString(*i_));
+                    NodeMenuModeCondition *userCond = new NodeMenuModeCondition(QString::fromStdString(*i_));
                     operandStack.push_back(userCond);
                     result = userCond;
                     updatedOperands = true;
@@ -409,7 +410,7 @@ BaseNodeCondition *NodeExpressionParser::parseExpression(bool caseSensitiveStrin
             // but do not do this if the last function asks to delay this process
             if (!funcStack.empty() && !funcStack.back()->delayUnwinding())
             {
-                if(updatedOperands && (operandStack.size() >= funcStack.back()->numOperands()))
+                if(updatedOperands && (static_cast<int>(operandStack.size()) >= funcStack.back()->numOperands()))
                 {
                     std::vector<BaseNodeCondition *> operands;
                     result = funcStack.back();       // last function is the current result
@@ -435,7 +436,7 @@ BaseNodeCondition *NodeExpressionParser::parseExpression(bool caseSensitiveStrin
     // final unwinding of the stack
     while (!funcStack.empty())
     {
-        if(operandStack.size() >= funcStack.back()->numOperands())
+        if(static_cast<int>(operandStack.size()) >= funcStack.back()->numOperands())
         {
             std::vector<BaseNodeCondition *> operands;
             result = funcStack.back();  // last function is the current result           
@@ -476,7 +477,7 @@ bool BaseNodeCondition::containsAttributeSearch()
     bool contains = false;
 
     // check child condition nodes
-    for (int i = 0; i < operands_.size(); i++)
+    for(std::size_t i = 0; i < operands_.size(); i++)
     {
         contains = contains | operands_[i]->containsAttributeSearch();
     }
@@ -610,16 +611,16 @@ bool StateNodeCondition::execute(VItem* item)
 
 //=========================================================================
 //
-//  UserLevelCondition
+// UserMenuModeCondition
 //
 //=========================================================================
 
-bool UserLevelCondition::execute(VItem*)
+bool NodeMenuModeCondition::execute(VItem*)
 {
     // since we don't currently have the concept of user levels, we just 
     // return true for now
 
-    return true;
+    return MenuHandler::nodeMenuMode() == menuModeName_;
 }
 
 
diff --git a/Viewer/src/NodeExpression.hpp b/Viewer/src/NodeExpression.hpp
index 9d5c6df..610e4a2 100644
--- a/Viewer/src/NodeExpression.hpp
+++ b/Viewer/src/NodeExpression.hpp
@@ -49,7 +49,7 @@ public:
 protected:
     NodeExpressionParser();
 
-    bool isUserLevel(const std::string &str) const;
+    bool isMenuMode(const std::string &str) const;
     bool isNodeHasAttribute(const std::string &str) const;
     bool isNodeFlag(const std::string &str) const;
     bool isWhatToSearchIn(const std::string &str, bool &isAttribute) const;
@@ -296,17 +296,17 @@ private:
 // User level condition
 // --------------------
 
-class UserLevelCondition : public BaseNodeCondition
+class NodeMenuModeCondition : public BaseNodeCondition
 {
 public:
-    explicit UserLevelCondition(QString userLevelName) : userLevelName_(userLevelName) {}
-    ~UserLevelCondition() {}
+    explicit NodeMenuModeCondition(QString menuModeName) : menuModeName_(menuModeName) {}
+    ~NodeMenuModeCondition() {}
 
     bool execute(VItem*);
-    std::string print() {return userLevelName_.toStdString();}
+    std::string print() {return menuModeName_.toStdString();}
 
 private:
-    QString userLevelName_;
+    QString menuModeName_;
 };
 
 // -----------------------------------------------------------------
diff --git a/Viewer/src/NodePanel.cpp b/Viewer/src/NodePanel.cpp
index f4a077a..6ad427b 100644
--- a/Viewer/src/NodePanel.cpp
+++ b/Viewer/src/NodePanel.cpp
@@ -54,8 +54,8 @@ Dashboard *NodePanel::addWidget(QString id)
 
 	addTab(nw,pix,name);
 
-	connect(nw,SIGNAL(selectionChanged(VInfo_ptr)),
-			this,SIGNAL(selectionChanged(VInfo_ptr)));
+    connect(nw,SIGNAL(selectionChanged(VInfo_ptr)),
+            this,SLOT(slotSelectionChangedInWidget(VInfo_ptr)));
 
     connect(nw->titleHandler(),SIGNAL(changed(DashboardTitle*)),
                 this,SLOT(slotTabTitle(DashboardTitle*)));
@@ -150,6 +150,16 @@ void NodePanel::slotSelection(VInfo_ptr n)
 			w->currentSelection(n);
 }
 
+void NodePanel::slotSelectionChangedInWidget(VInfo_ptr n)
+{
+    if(Dashboard *w=static_cast<Dashboard*>(sender()))
+    {
+        if(w == currentDashboard())
+            Q_EMIT selectionChangedInCurrent(n);
+
+    }
+}
+
 bool NodePanel::selectInTreeView(VInfo_ptr info)
 {
     for(int i=0; i < count(); i++)
diff --git a/Viewer/src/NodePanel.hpp b/Viewer/src/NodePanel.hpp
index e54e914..a8814da 100644
--- a/Viewer/src/NodePanel.hpp
+++ b/Viewer/src/NodePanel.hpp
@@ -57,6 +57,7 @@ public Q_SLOTS:
 	void slotCurrentWidgetChanged(int);
     void slotSelection(VInfo_ptr);
     void slotNewTab();
+    void slotSelectionChangedInWidget(VInfo_ptr);
 
 protected Q_SLOTS:
     void slotTabRemoved();
@@ -65,7 +66,7 @@ protected Q_SLOTS:
 Q_SIGNALS:
 	void itemInfoChanged(QString);
 	void currentWidgetChanged();
-	void selectionChanged(VInfo_ptr);
+    void selectionChangedInCurrent(VInfo_ptr);
 	void contentsChanged();
 
 protected:
diff --git a/Viewer/src/NodePathWidget.cpp b/Viewer/src/NodePathWidget.cpp
index 5fbdcc4..e33b351 100644
--- a/Viewer/src/NodePathWidget.cpp
+++ b/Viewer/src/NodePathWidget.cpp
@@ -1060,7 +1060,7 @@ void NodePathWidget::setPath(VInfo_ptr info)
 #endif
 		QColor fontCol=n->stateFontColour();
 		name=n->name();
-		bool hasChildren=hasChildren=(n->numOfChildren() >0);
+        bool hasChildren=(n->numOfChildren() >0);
 
         if(i==0)
         {
@@ -1151,7 +1151,7 @@ void NodePathWidget::loadMenu(const QPoint& pos,VInfo_ptr p)
 		QList<QAction*> acLst;
 		VNode* node=p->node();
 
-		for(unsigned int i=0; i < node->numOfChildren(); i++)
+        for(int i=0; i < node->numOfChildren(); i++)
 		{
 			QAction *ac=new QAction(node->childAt(i)->name(),this);
 			ac->setData(i);
@@ -1200,11 +1200,11 @@ void NodePathWidget::notifyBeginNodeChange(const VNode* node, const std::vector<
 		   std::find(aspect.begin(),aspect.end(),ecf::Aspect::SUSPENDED) != aspect.end())
 		{
 			std::vector<VNode*> nodes=info_->node()->ancestors(VNode::ParentToChildSort);
-			for(unsigned int i=0; i < nodes.size(); i++)
+            for(int i=0; i < static_cast<int>(nodes.size()); i++)
 			{
-				if(nodes.at(i) == node)
+                if(nodes[i] == node)
 				{
-					if(i < nodeItems_.count())
+                    if(i < nodeItems_.count())
 					{						
                         bc_->reset(i,node->name(),node->stateColour(),node->stateFontColour());
 					}
diff --git a/Viewer/src/NodePathWidget.hpp b/Viewer/src/NodePathWidget.hpp
index e608e13..ba1d307 100644
--- a/Viewer/src/NodePathWidget.hpp
+++ b/Viewer/src/NodePathWidget.hpp
@@ -104,6 +104,8 @@ friend class BcWidget;
     
 public:
     NodePathItem(BcWidget* owner,int index,QString text,QColor bgCol,QColor fontCol,bool hasMenu,bool current);
+    virtual ~NodePathItem() {}
+
     void setCurrent(bool);
     virtual void draw(QPainter*,bool,int);
     int adjust(int xp,int yp, int elidedLen=0);
diff --git a/Viewer/src/NodeQueryEditor.cpp b/Viewer/src/NodeQueryEditor.cpp
index 82d081d..0812ace 100644
--- a/Viewer/src/NodeQueryEditor.cpp
+++ b/Viewer/src/NodeQueryEditor.cpp
@@ -115,7 +115,8 @@ NodeQueryEditor::NodeQueryEditor(QWidget *parent) :
 	queryTe_->setReadOnly(true);
     queryTe_->setWordWrapMode(QTextOption::WordWrap);
 
-    Highlighter* ih=new Highlighter(queryTe_->document(),"query");
+    //The document becomes the owner of the highlighter
+    new Highlighter(queryTe_->document(),"query");
 
     //------------------
     // Options
diff --git a/Viewer/src/NodeQueryEngine.cpp b/Viewer/src/NodeQueryEngine.cpp
index 945db22..d50e602 100644
--- a/Viewer/src/NodeQueryEngine.cpp
+++ b/Viewer/src/NodeQueryEngine.cpp
@@ -29,12 +29,12 @@ NodeQueryEngine::NodeQueryEngine(QObject* parent) :
     QThread(parent),
     query_(new NodeQuery("tmp")),
     parser_(NULL),
-    stopIt_(false),
-    maxReached_(false),
     cnt_(0),
     scanCnt_(0),
     maxNum_(250000),
     chunkSize_(100),
+    stopIt_(false),
+    maxReached_(false),   
     rootNode_(0)
 {
     //We will need to pass various non-Qt types via signals and slots
@@ -222,7 +222,7 @@ void NodeQueryEngine::runRecursively(VNode *node)
                         hasType=true;
                         if(it.value()->execute(av[i]))
                         {
-                            broadcastFind(node,av[i]->data());
+                            broadcastFind(node,av[i]->data(true));
                             scanCnt_++;
                          }
                     }
diff --git a/Viewer/src/NodeQueryResult.cpp b/Viewer/src/NodeQueryResult.cpp
index 88c383a..da61fe1 100644
--- a/Viewer/src/NodeQueryResult.cpp
+++ b/Viewer/src/NodeQueryResult.cpp
@@ -95,6 +95,15 @@ QColor NodeQueryResultItem::stateColour() const
 	return QColor(Qt::transparent);
 }
 
+QString NodeQueryResultItem::stateChangeTime() const
+{
+    QString s;
+    if(node_)
+        node_->statusChangeTime(s);
+
+    return s;
+}
+
 QStringList NodeQueryResultItem::attr() const
 {
     return attr_;
@@ -152,7 +161,7 @@ NodeQueryResult::~NodeQueryResult()
 
 NodeQueryResultItem* NodeQueryResult::itemAt(int i)
 {
-	if(i >= 0 && i < data_.size())
+    if(i >= 0 && i < static_cast<int>(data_.size()))
 		return data_.at(i);
 
 	return NULL;
diff --git a/Viewer/src/NodeQueryResult.hpp b/Viewer/src/NodeQueryResult.hpp
index b3a910d..4d69f23 100644
--- a/Viewer/src/NodeQueryResult.hpp
+++ b/Viewer/src/NodeQueryResult.hpp
@@ -29,6 +29,7 @@ class NodeQueryResultItem
 	friend class NodeQueryEngine;
 	friend class NodeQueryResult;
 	friend class NodeQueryResultModel;
+	friend class TriggerGraphModel;
 
 public:
 	NodeQueryResultItem() : node_(NULL), server_(NULL) {}
@@ -43,6 +44,7 @@ public:
 	QString typeStr() const;
 	QString stateStr() const;
 	QColor stateColour() const;
+    QString stateChangeTime() const;
     QStringList attr() const;
     bool hasAttribute() const {return attr_.count() > 0;}
 
diff --git a/Viewer/src/NodeQueryResultModel.cpp b/Viewer/src/NodeQueryResultModel.cpp
index ded867b..257c532 100644
--- a/Viewer/src/NodeQueryResultModel.cpp
+++ b/Viewer/src/NodeQueryResultModel.cpp
@@ -129,6 +129,8 @@ QVariant NodeQueryResultModel::data( const QModelIndex& index, int role ) const
 			return d->typeStr();
 		else if(id == "status")
             return d->stateStr();
+        else if(id == "statusChange")
+            return d->stateChangeTime();
         else if(id == "attribute")
             return d->attr();
 
@@ -143,7 +145,7 @@ QVariant NodeQueryResultModel::data( const QModelIndex& index, int role ) const
 	}
 	else if(role == Qt::TextAlignmentRole)
 	{
-		if(id == "status" || id == "type")
+        if(id == "status" || id == "type" || id == "statusChange")
 			return Qt::AlignCenter;
 
 		return QVariant();
@@ -167,7 +169,7 @@ QVariant NodeQueryResultModel::headerData( const int section, const Qt::Orientat
 		return columns_->tooltip(section);
 	else if(role == Qt::TextAlignmentRole)
 	{
-		if(id == "status" || id == "type")
+        if(id == "status" || id == "type" || id == "statusChange")
 			return Qt::AlignCenter;
 	}
 
diff --git a/Viewer/src/NodeQueryResultView.cpp b/Viewer/src/NodeQueryResultView.cpp
index 3df1bba..d76cbe5 100644
--- a/Viewer/src/NodeQueryResultView.cpp
+++ b/Viewer/src/NodeQueryResultView.cpp
@@ -32,7 +32,7 @@ NodeQueryResultView::NodeQueryResultView(QWidget* parent) :
 	//setProperty("style","nodeView");
 	setProperty("view","query");
 
-	actionHandler_=new ActionHandler(this);
+    actionHandler_=new ActionHandler(this,this);
 
 	sortModel_=new QSortFilterProxyModel(this);
 	//sortModel_->setDynamicSortFilter(true);
diff --git a/Viewer/src/NodeQueryViewDelegate.cpp b/Viewer/src/NodeQueryViewDelegate.cpp
index 4e84c71..c1a6649 100644
--- a/Viewer/src/NodeQueryViewDelegate.cpp
+++ b/Viewer/src/NodeQueryViewDelegate.cpp
@@ -138,8 +138,9 @@ void NodeQueryViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &
     			QMap<QString,AttributeRendererProc>::const_iterator it=attrRenderers_.find(lst.at(0));
     			if(it != attrRenderers_.end())
     			{
-    				AttributeRendererProc a=it.value();
-    				(this->*a)(painter,lst,vopt);
+                    QSize size;
+                    AttributeRendererProc a=it.value();
+                    (this->*a)(painter,lst,vopt,size);
     			}
     		}
     	}
diff --git a/Viewer/src/NodeSearchWidget.cpp b/Viewer/src/NodeSearchWidget.cpp
index 88130dd..d8241b9 100644
--- a/Viewer/src/NodeSearchWidget.cpp
+++ b/Viewer/src/NodeSearchWidget.cpp
@@ -314,8 +314,9 @@ void NodeSearchWidget::adjustColumns()
         QFontMetrics fm(f);
         resTree_->setColumnWidth(0,fm.width("serverserverserse"));
         resTree_->setColumnWidth(1,fm.width("/suite/family1/family2/longtaskname1"));
-        resTree_->setColumnWidth(2,fm.width("suspended"));
-        resTree_->setColumnWidth(3,fm.width("family"));
+        resTree_->setColumnWidth(2,fm.width("suspendedAA"));
+        resTree_->setColumnWidth(3,fm.width("familyAA"));
+        resTree_->setColumnWidth(4,fm.width("2017-Mar-07 15:45:56AA"));
 	}
 }
 
@@ -346,7 +347,7 @@ void NodeSearchWidget::readSettings(const QSettings &settings)
         for(int i=0; i < lst.count(); i++)
             resTree_->setColumnWidth(i,lst[i].toInt());
 
-        if(lst.count() >= 3)
+        if(lst.count() >= 4)
             columnsAdjusted_=true;
     }
 }
diff --git a/Viewer/src/NodeViewBase.hpp b/Viewer/src/NodeViewBase.hpp
index 430a073..af391e5 100644
--- a/Viewer/src/NodeViewBase.hpp
+++ b/Viewer/src/NodeViewBase.hpp
@@ -14,10 +14,12 @@
 #include "VInfo.hpp"
 
 class QWidget;
+class QObject;
 
 class TableNodeSortModel;
 class NodeFilterDef;
 class VSettings;
+class QModelIndex;
 
 class NodeViewBase
 {
@@ -27,7 +29,8 @@ public:
 
 		virtual void reload()=0;
 		virtual void rerender()=0;
-		virtual QWidget* realWidget()=0;
+        virtual QWidget* realWidget()=0;
+        virtual QObject* realObject()=0;
         virtual VInfo_ptr currentSelection()=0;
 		virtual void selectFirstServer()=0;
         virtual void setCurrentSelection(VInfo_ptr n)=0;
diff --git a/Viewer/src/NodeViewDelegate.cpp b/Viewer/src/NodeViewDelegate.cpp
index e088f02..73a32af 100644
--- a/Viewer/src/NodeViewDelegate.cpp
+++ b/Viewer/src/NodeViewDelegate.cpp
@@ -298,12 +298,14 @@ void NodeViewDelegate::renderStatus(QPainter *painter,const QModelIndex& index,
 // "meter" name  value min  max colChange
 //========================================================
 
-int NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
 
-    if(data.count() != 6)
-        return totalWidth;
+    size=QSize(totalWidth,attrBox_->fullHeight);
+
+    if(data.count() < 6)
+        return;
 
 	//The data
 	int	val=data.at(2).toInt();
@@ -314,6 +316,10 @@ int NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QStyl
     bool selected=option.state & QStyle::State_Selected;
 
     QString name=data.at(1) + ":";
+
+    if(data.count() == 7)
+        name.prepend(data[6] + ":");
+
     QString valStr=data.at(2);
     QFontMetrics fm(attrFont_);
 
@@ -424,7 +430,7 @@ int NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QStyl
 		painter->restore();
 	}
 
-    return totalWidth;
+    size.setWidth(totalWidth);
 }
 
 //========================================================
@@ -432,20 +438,19 @@ int NodeViewDelegate::renderMeter(QPainter *painter,QStringList data,const QStyl
 // "label" name  value
 //========================================================
 
-int NodeViewDelegate::renderLabel(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderLabel(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
+    size=QSize(totalWidth,attrBox_->fullHeight);
 
     if(data.count() < 2)
-       return totalWidth;
+       return;
 
 	QString name=data.at(1) + ":";
 	QString val;
 	if(data.count() > 2)
 		val=data.at(2);
 
-    int offset=2;
-
     bool selected=option.state & QStyle::State_Selected;
 
 	//The border rect (we will adjust its  width)
@@ -556,7 +561,7 @@ int NodeViewDelegate::renderLabel(QPainter *painter,QStringList data,const QStyl
 		painter->restore();
 	}
 
-    return totalWidth;
+    size=QSize(totalWidth,labelHeight(multiCnt+1));
 }
 
 void NodeViewDelegate::labelSize(QStringList data,int& totalWidth,int& totalHeight) const
@@ -649,15 +654,24 @@ int NodeViewDelegate::labelHeight(int lineNum) const
 // "event" name  value
 //========================================================
 
-int NodeViewDelegate::renderEvent(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderEvent(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
+
+    size=QSize(totalWidth,attrBox_->fullHeight);
+
     if(data.count() < 2)
-        return totalWidth;
+        return;
 
-	QString name=data.at(1);
+    QString name=data[1];
 	bool val=false;
-	if(data.count() > 2) val=(data.at(2) == "1");
+    if(data.count() > 2) val=(data[2] == "1");
+
+    //Add full path
+    if(data.count() > 3)
+    {
+        name.prepend(data[3] + ":/");
+    }
 
     bool selected=option.state & QStyle::State_Selected;
     QFont font=attrFont_;
@@ -711,44 +725,47 @@ int NodeViewDelegate::renderEvent(QPainter *painter,QStringList data,const QStyl
 		painter->restore();
 	}
 
-    return totalWidth;
+    size.setWidth(totalWidth);
 }
 
-int NodeViewDelegate::renderVar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderVarCore(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size,QColor textCol) const
 {
     int totalWidth=0;
     QString text;
 
-	if(data.count() >1)
-		text+=data.at(1) + "=";
-	if(data.count() > 2)
-		text+=data.at(2);
+    if(data.count() >1)
+        text+=data.at(1) + "=";
+    if(data.count() > 2)
+        text+=data.at(2);
+
+    if(data.count() == 4)
+        text.prepend(data[3] + ":");
 
     bool selected=option.state & QStyle::State_Selected;
 
     //The contents rect (we will adjust its  width)
     QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
 
-	//The text rectangle
-	QFont font=attrFont_;
-	QFontMetrics fm(font);
-	int textWidth=fm.width(text);
+    //The text rectangle
+    QFont font=attrFont_;
+    QFontMetrics fm(font);
+    int textWidth=fm.width(text);
     QRect textRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
-	textRect.setWidth(textWidth);
+    textRect.setWidth(textWidth);
 
-	//Define clipping
+    //Define clipping
     int rightPos=textRect.x()+textRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
     totalWidth=rightPos-option.rect.left();
-	const bool setClipRect = rightPos > option.rect.right();
-	if(setClipRect)
-	{
-		painter->save();
-		painter->setClipRect(option.rect);
-	}
+    const bool setClipRect = rightPos > option.rect.right();
+    if(setClipRect)
+    {
+        painter->save();
+        painter->setClipRect(option.rect);
+    }
 
-	//Draw text
-	painter->setPen(Qt::black);
-	painter->setFont(font);
+    //Draw text
+    painter->setPen(textCol);
+    painter->setFont(font);
     painter->drawText(attrBox_->adjustTextRect(textRect),Qt::AlignLeft | Qt::AlignVCenter,text);
 
     if(selected && drawAttrSelectionRect_)
@@ -758,72 +775,33 @@ int NodeViewDelegate::renderVar(QPainter *painter,QStringList data,const QStyleO
         renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
     }
 
-	if(setClipRect)
-	{
-		painter->restore();
-	}
+    if(setClipRect)
+    {
+        painter->restore();
+    }
 
-    return totalWidth;
+    size=QSize(totalWidth,attrBox_->fullHeight);
 }
 
-int  NodeViewDelegate::renderGenvar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
-{
-    int totalWidth=0;
-
-    QString text;
-
-	if(data.count() >1)
-		text+=data.at(1) + "=";
-	if(data.count() > 2)
-		text+=data.at(2);
-
-    bool selected=option.state & QStyle::State_Selected;
 
-    //The contents rect (we will adjust its  width)
-    QRect contRect=option.rect.adjusted(attrBox_->leftMargin,attrBox_->topMargin,0,-attrBox_->bottomMargin);
-
-	//The text rectangle
-	QFont font=attrFont_;
-	//nameFont.setBold(true);
-	QFontMetrics fm(font);
-	int textWidth=fm.width(text);
-    QRect textRect = contRect.adjusted(attrBox_->leftPadding,0,0,0);
-	textRect.setWidth(textWidth);
-
-	//Define clipping
-    int rightPos=textRect.x()+textRect.width()+attrBox_->rightPadding+attrBox_->rightMargin;
-	const bool setClipRect = rightPos > option.rect.right();
-	if(setClipRect)
-	{
-		painter->save();
-		painter->setClipRect(option.rect);
-	}
-
-	//Draw text
-	painter->setPen(Qt::blue);
-	painter->setFont(font);
-    painter->drawText(attrBox_->adjustTextRect(textRect),Qt::AlignLeft | Qt::AlignVCenter,text);
-
-    if(selected && drawAttrSelectionRect_)
-    {
-        QRect sr=option.rect;
-        sr.setWidth(rightPos-sr.x());
-        renderSelectionRect(painter,attrBox_->adjustSelectionRect(sr));
-    }
-
-	if(setClipRect)
-	{
-		painter->restore();
-    }
+void NodeViewDelegate::renderVar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
+{
+    renderVarCore(painter,data,option,size,Qt::black);
+}
 
-    return totalWidth;
+void NodeViewDelegate::renderGenvar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
+{
+    renderVarCore(painter,data,option,size,Qt::blue);
 }
 
-int NodeViewDelegate::renderLimit(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderLimit(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
-    if(data.count() != 4)
-        return totalWidth;
+
+    size=QSize(totalWidth,attrBox_->fullHeight);
+
+    if(data.count() < 4)
+        return;
 
 	//The data
 	int	val=data.at(2).toInt();
@@ -832,6 +810,9 @@ int NodeViewDelegate::renderLimit(QPainter *painter,QStringList data,const QStyl
     QString valStr=QString::number(val) + "/" + QString::number(maxVal);
     int totalVal=qMax(val,maxVal); //val can be larger than maxVal!!
 
+    if(data.count() == 5)
+        name.prepend(data[4] + ":");
+
     bool selected=option.state & QStyle::State_Selected;
 
     //The contents rect (we will adjust its  width)
@@ -967,16 +948,23 @@ int NodeViewDelegate::renderLimit(QPainter *painter,QStringList data,const QStyl
 		painter->restore();
 	}
 
-    return totalWidth;
+    size.setWidth(totalWidth);
 }
 
-int NodeViewDelegate::renderLimiter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderLimiter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
-    if(data.count() != 3)
-        return totalWidth;
+
+    size=QSize(totalWidth,attrBox_->fullHeight);
+
+    if(data.count() < 3)
+        return;
 
 	QString name="inlimit " + data.at(2) +":" +data.at(1);
+
+    if(data.count() == 4)
+        name.prepend(data[3] + ":");
+
     bool selected=option.state & QStyle::State_Selected;
 
     //The contents rect (we will adjust its  width)
@@ -1017,14 +1005,17 @@ int NodeViewDelegate::renderLimiter(QPainter *painter,QStringList data,const QSt
 		painter->restore();
 	}
 
-    return totalWidth;
+    size.setWidth(totalWidth);
 }
 
-int NodeViewDelegate::renderTrigger(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderTrigger(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
+
+    size=QSize(totalWidth,attrBox_->fullHeight);
+
     if(data.count() !=3)
-        return totalWidth;
+        return;
 
     int triggerType=data[1].toInt();
 	QString	text=data.at(2);   
@@ -1090,16 +1081,23 @@ int NodeViewDelegate::renderTrigger(QPainter *painter,QStringList data,const QSt
 		painter->restore();
 	}
 
-    return totalWidth;
+    size.setWidth(totalWidth);
 }
 
-int NodeViewDelegate::renderTime(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderTime(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
-    if(data.count() != 2)
-        return totalWidth;
 
-	QString name=data.at(1);
+    size=QSize(totalWidth,attrBox_->fullHeight);
+
+    if(data.count() < 2)
+        return;
+
+    QString name=data[1];
+
+    if(data.count() == 3)
+        name.prepend(data[2] + ":");
+
     bool selected=option.state & QStyle::State_Selected;
 
     //The contents rect (we will adjust its  width)
@@ -1140,16 +1138,23 @@ int NodeViewDelegate::renderTime(QPainter *painter,QStringList data,const QStyle
 		painter->restore();
 	}
 
-    return totalWidth;
+    size.setWidth(totalWidth);
 }
 
-int NodeViewDelegate::renderDate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderDate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
-    if(data.count() != 2)
-        return totalWidth;
 
-	QString name=data.at(1);
+    size=QSize(totalWidth,attrBox_->fullHeight);
+
+    if(data.count() < 2)
+        return;
+
+    QString name=data[1];
+
+    if(data.count() == 3)
+        name.prepend(data[2] + ":");
+
     bool selected=option.state & QStyle::State_Selected;
 
     //The contents rect (we will adjust its  width)
@@ -1190,7 +1195,7 @@ int NodeViewDelegate::renderDate(QPainter *painter,QStringList data,const QStyle
 		painter->restore();
 	}
 
-    return totalWidth;
+    size.setWidth(totalWidth);
 }
 
 //========================================================
@@ -1198,11 +1203,14 @@ int NodeViewDelegate::renderDate(QPainter *painter,QStringList data,const QStyle
 // "repeat" name  value
 //========================================================
 
-int NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
-    if(data.count() !=  7)
-         return totalWidth;
+
+    size=QSize(totalWidth,attrBox_->fullHeight);
+
+    if(data.count() <  7)
+         return;
 
     QString type=data.at(1);
     QString name=data.at(2);
@@ -1211,6 +1219,9 @@ int NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSty
     QString end=data.at(5);
     QString step=data.at(6);
 
+    if(data.count() == 9)
+        name.prepend(data[8] + ":");
+
     bool selected=option.state & QStyle::State_Selected;
 
     //The contents rect (we will adjust its  width)
@@ -1346,16 +1357,23 @@ int NodeViewDelegate::renderRepeat(QPainter *painter,QStringList data,const QSty
         }
      }
 
-    return totalWidth;
+    size.setWidth(totalWidth);
 }
 
-int NodeViewDelegate::renderLate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const
+void NodeViewDelegate::renderLate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option,QSize& size) const
 {
     int totalWidth=0;
-	if(data.count() != 2)
-        return totalWidth;
 
-	QString name="late: " + data.at(1);
+    size=QSize(totalWidth,attrBox_->fullHeight);
+
+    if(data.count() < 2)
+        return;
+
+    QString name="late: " + data[1];
+
+    if(data.count() == 3)
+        name.prepend(data[2] + ":");
+
     bool selected=option.state & QStyle::State_Selected;
 
 	//The border rect (we will adjust its  width)
@@ -1395,5 +1413,5 @@ int NodeViewDelegate::renderLate(QPainter *painter,QStringList data,const QStyle
 		painter->restore();
 	}
 
-    return totalWidth;
+    size.setWidth(totalWidth);
 }
diff --git a/Viewer/src/NodeViewDelegate.hpp b/Viewer/src/NodeViewDelegate.hpp
index 539136b..e825806 100644
--- a/Viewer/src/NodeViewDelegate.hpp
+++ b/Viewer/src/NodeViewDelegate.hpp
@@ -32,6 +32,8 @@ struct BaseNodeDelegateBox
        leftMargin(0), rightMargin(0), topPadding(0), bottomPadding(0),
        leftPadding(0), rightPadding(0), sizeHintCache(QSize(10,10)), spacing(2), selectRm(2) {}
 
+    virtual ~BaseNodeDelegateBox() {}
+
     virtual void adjust(const QFont& f)=0;
     virtual QRect adjustTextRect(const QRect& rIn) const { QRect r=rIn; return r;}
     virtual QRect adjustTextBgRect(const QRect& rIn) const { QRect r=rIn; return r;}
@@ -126,23 +128,24 @@ protected:
 	virtual void renderStatus(QPainter *painter,const QModelIndex& index,
                               const QStyleOptionViewItem& option) const;
 
-    typedef int (NodeViewDelegate::*AttributeRendererProc)(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-
-    virtual int renderMeter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderLabel(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderEvent(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderVar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderGenvar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderLimit(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderLimiter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderTrigger(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderTime(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderDate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderRepeat(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
-    virtual int renderLate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option) const;
+    typedef void (NodeViewDelegate::*AttributeRendererProc)(QPainter *painter,QStringList data,const QStyleOptionViewItem& optio,QSize&) const;
+
+    virtual void renderMeter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderLabel(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderEvent(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderVar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderGenvar(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderLimit(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderLimiter(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderTrigger(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderTime(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderDate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderRepeat(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
+    virtual void renderLate(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&) const;
 
     void labelSize(QStringList data,int& totalWidth,int& totalHeight) const;
     int labelHeight(int) const;
+    void renderVarCore(QPainter *painter,QStringList data,const QStyleOptionViewItem& option, QSize&,QColor) const;
 
 	QPen hoverPen_;
 	QBrush hoverBrush_;
diff --git a/Viewer/src/NodeWidget.hpp b/Viewer/src/NodeWidget.hpp
index 9052b8e..460380f 100644
--- a/Viewer/src/NodeWidget.hpp
+++ b/Viewer/src/NodeWidget.hpp
@@ -52,11 +52,6 @@ protected Q_SLOTS:
 	void slotInfoPanelAction();
     void slotSelectionChangedInBc(VInfo_ptr info);
 
-Q_SIGNALS:
-    //void selectionChanged(VInfo_ptr);
-	void popInfoPanel(VInfo_ptr,QString);
-	void dashboardCommand(VInfo_ptr,QString);
-
 protected:
 	explicit NodeWidget(const std::string& type,ServerFilter* serverFilter,QWidget* parent=0);
 	virtual ~NodeWidget();
diff --git a/Viewer/src/OneLineTextEdit.cpp b/Viewer/src/OneLineTextEdit.cpp
index d020891..686cef0 100644
--- a/Viewer/src/OneLineTextEdit.cpp
+++ b/Viewer/src/OneLineTextEdit.cpp
@@ -34,7 +34,8 @@ OneLineTextEdit::OneLineTextEdit(QWidget* parent) :  QTextEdit(parent)
 
 	setFixedHeight(h);
 
-	Highlighter* ih=new Highlighter(document(),"query");
+    //The document becomes the owner of the highlighter
+    new Highlighter(document(),"query");
 }
 
 QSize OneLineTextEdit::sizeHint() const
diff --git a/Viewer/src/OutputFetchInfo.cpp b/Viewer/src/OutputFetchInfo.cpp
index 0fd180b..03cbc64 100644
--- a/Viewer/src/OutputFetchInfo.cpp
+++ b/Viewer/src/OutputFetchInfo.cpp
@@ -104,7 +104,7 @@ void OutputFetchInfo::setInfo(VReply *reply,VInfo_ptr info)
         {
             t+="<li>Try to read the output files from the logserver \
                (if defined)</li><li>from disk</li><li>\
-               through the ecflow server (if <b>not</b> the <b>current</b> job output) </li>";
+               through the ecflow server (if the <b>current</b> job output) </li>";
         }
         else
         {
@@ -112,15 +112,15 @@ void OutputFetchInfo::setInfo(VReply *reply,VInfo_ptr info)
                (if defined)</li><li>from disk (if <b>not</b> the <b>current</b> job output)</li>\
                <li>from the ecflow server (if the <b>current</b> job output)</li> ";
         }
-        t+="</ul> (To change this behaviour go Edit -> Preferences -> Server options -> Files)";
+        t+="</ul> (To change this behaviour go Tools -> Preferences -> Server settings -> Fetching files)";
 
         alg=t;
 
         if(reply->tmpFile() && reply->fileReadMode() == VReply::LocalReadMode &&
             !server->isLocalHost())
         {
-            remarks << "The output file was read <b>from disk</b> but the server's \
-                       host (" + QString::fromStdString(server->host()) +
+            remarks << "The output file was read <b>from disk</b> but the server (" +
+                       QString::fromStdString(server->host()) +
                        ") is not running on the local machine. If the path is machine-specific (e.g. /tmp) \
                        and there exists a file with the same path on the local machine, then\
                        this will have been read instead.";
diff --git a/Viewer/src/OutputFileClient.cpp b/Viewer/src/OutputFileClient.cpp
index 3b2b61f..59adbf2 100644
--- a/Viewer/src/OutputFileClient.cpp
+++ b/Viewer/src/OutputFileClient.cpp
@@ -19,8 +19,8 @@ OutputFileClient::OutputFileClient(const std::string& host,const std::string& po
 	total_(0),
     expected_(0),
 	lastProgress_(0),
-	progressChunk_(1024*1024),
-	progressUnits_("MB")
+    progressUnits_("MB"),
+    progressChunk_(1024*1024)
 {
 }
 
@@ -176,7 +176,7 @@ void OutputFileClient::estimateExpectedSize()
 #ifdef _UI_OUTPUTFILECLIENT_DEBUG
     UiLog().dbg() << "OutputFileClient::estimateExpectedSize -->";
 #endif
-    for(unsigned int i=0; i < dir_->count(); i++)
+    for(int i=0; i < dir_->count(); i++)
     {
 #ifdef _UI_OUTPUTFILECLIENT_DEBUG
         UiLog().dbg() << "file: " << dir_->fullName(i);
diff --git a/Viewer/src/OutputFileProvider.cpp b/Viewer/src/OutputFileProvider.cpp
index 6b87ad7..c123de3 100644
--- a/Viewer/src/OutputFileProvider.cpp
+++ b/Viewer/src/OutputFileProvider.cpp
@@ -148,13 +148,13 @@ void OutputFileProvider::fetchFile(ServerHandler *server,VNode *n,const std::str
 		return;
 	}
 
-    //Check if it is tryno 0
-    if(boost::algorithm::ends_with(fileName,".0"))
+    //Check if tryno is 0. ie. the file is the current jobout file and ECF_TRYNO = 0
+    if(isTryNoZero(fileName))
     {
         reply_->setInfoText("Current job output does not exist yet (<b>TRYNO</b> is <b>0</b>)!)");
         reply_->addLog("MSG>Current job output does not exist yet (<b>TRYNO</b> is <b>0</b>)!");
         owner_->infoReady(reply_);
-    	return;
+        return;
     }
 
     //----------------------------------
@@ -271,7 +271,7 @@ bool OutputFileProvider::fetchFileViaOutputClient(VNode *n,const std::string& fi
     //If we are here we do not need to know the previously cached item
     latestCached_=NULL;
 
-    //We did not used the cache
+    //We did not use the cache
     if(n->logServer(host,port))
 	{
 		//host=host + "baaad";
@@ -429,9 +429,20 @@ std::string OutputFileProvider::joboutFileName() const
 	return std::string();
 }
 
+//Returns true if
+//   -the file is the current jobout
+//   -id contains the string ".0"
+//   -ECF_TRYNO = 0
+
 bool OutputFileProvider::isTryNoZero(const std::string& filename) const
 {
-    return boost::algorithm::ends_with(filename,".0");
+    if(filename.find(".0") != std::string::npos &&
+       joboutFileName() == filename &&
+       info_ && info_->isNode() && info_->node() && info_->node()->node())
+    {
+        return (info_->node()->findVariable("ECF_TRYNO",true) == "0");
+    }
+    return false;
 }
 
 void OutputFileProvider::setDir(VDir_ptr dir)
diff --git a/Viewer/src/OverviewItemWidget.cpp b/Viewer/src/OverviewItemWidget.cpp
index 539f47c..214b8ed 100644
--- a/Viewer/src/OverviewItemWidget.cpp
+++ b/Viewer/src/OverviewItemWidget.cpp
@@ -31,7 +31,8 @@ OverviewItemWidget::OverviewItemWidget(QWidget *parent) :
 
 	textEdit_->setShowLineNumbers(false);
 
-	Highlighter* ih=new Highlighter(textEdit_->document(),"info");
+    //The document becomes the owner of the highlighter
+    new Highlighter(textEdit_->document(),"info");
 
 	infoProvider_=new OverviewProvider(this);
 
diff --git a/Viewer/src/OverviewProvider.cpp b/Viewer/src/OverviewProvider.cpp
index ada0a40..a9f15c1 100644
--- a/Viewer/src/OverviewProvider.cpp
+++ b/Viewer/src/OverviewProvider.cpp
@@ -167,7 +167,7 @@ void OverviewProvider::serverInfo(VInfoServer* info,std::stringstream& f)
 
     //Print children
     VNode *vr=server->vRoot();
-    for(unsigned int i=0; i < vr->numOfChildren(); i++)
+    for(int i=0; i < vr->numOfChildren(); i++)
     {
     	f << inc << vr->childAt(i)->nodeType() << " " <<
     			vr->childAt(i)->strName() << "\n";
@@ -289,7 +289,7 @@ void OverviewProvider::nodeInfo(VInfoNode* info,std::stringstream& f)
     }
 
 	//Print children
-	for(unsigned int i=0; i < node->numOfChildren(); i++)
+    for(int i=0; i < node->numOfChildren(); i++)
 	{
 		f << inc << node->childAt(i)->nodeType() << " " <<
 	    			node->childAt(i)->strName() << "\n";
diff --git a/Viewer/src/Palette.cpp b/Viewer/src/Palette.cpp
index 99a1cc4..4a3d7a8 100644
--- a/Viewer/src/Palette.cpp
+++ b/Viewer/src/Palette.cpp
@@ -100,8 +100,7 @@ void Palette::load(const std::string& parFile)
 			{
 				QColor col=VProperty::toColour(val);
 				if(col.isValid())
-				{
-					QColor cc=palette.color(group,itP.value());
+				{					
 					palette.setColor(group,itP.value(),col);
 				}
 			}
diff --git a/Viewer/src/PlainTextEdit.cpp b/Viewer/src/PlainTextEdit.cpp
index 524fb37..13f87d5 100644
--- a/Viewer/src/PlainTextEdit.cpp
+++ b/Viewer/src/PlainTextEdit.cpp
@@ -25,13 +25,13 @@ PlainTextEdit::PlainTextEdit(QWidget * parent) :
     QPlainTextEdit(parent),
     showLineNum_(true),
     rightMargin_(2),
-    gotoLineDialog_(0),
     hyperlinkEnabled_(false),
-    fontProp_(NULL),
+    gotoLineDialog_(0),    
     numAreaBgCol_(232,231,230),
     numAreaFontCol_(102,102,102),
     numAreaSeparatorCol_(210,210,210),
-    numAreaCurrentCol_(212,212,255)
+    numAreaCurrentCol_(212,212,255),
+    fontProp_(0)
 {
     lineNumArea_ = new LineNumberArea(this);
 
diff --git a/Viewer/src/PlainTextSearchInterface.cpp b/Viewer/src/PlainTextSearchInterface.cpp
index 674eba8..110b711 100644
--- a/Viewer/src/PlainTextSearchInterface.cpp
+++ b/Viewer/src/PlainTextSearchInterface.cpp
@@ -148,7 +148,7 @@ void PlainTextSearchInterface::automaticSearchForKeywords(bool userClickedReload
 		// search direction
 		QTextDocument::FindFlags findFlags;
 		QTextCursor cursor(editor_->textCursor());
-		std::string searchFrom = vpAutomaticSearchFrom_->valueAsString();
+		std::string searchFrom = vpAutomaticSearchFrom_->valueAsStdString();
 		QTextCursor::MoveOperation move;
 		if (searchFrom == "bottom")
 		{
@@ -166,11 +166,11 @@ void PlainTextSearchInterface::automaticSearchForKeywords(bool userClickedReload
 			findFlags = findFlags | QTextDocument::FindCaseSensitively;
 
 		// string match mode
-		std::string matchMode(vpAutomaticSearchMode_->valueAsString());
+		std::string matchMode(vpAutomaticSearchMode_->valueAsStdString());
 		StringMatchMode::Mode mode = StringMatchMode::operToMode(matchMode);
 
 		// the term to be searched for
-		std::string searchTerm_s(vpAutomaticSearchText_->valueAsString());
+		std::string searchTerm_s(vpAutomaticSearchText_->valueAsStdString());
 		QString searchTerm = QString::fromStdString(searchTerm_s);
 
 		// perform the search
diff --git a/Viewer/src/PropertyDialog.cpp b/Viewer/src/PropertyDialog.cpp
index 87fd569..a06fb7b 100644
--- a/Viewer/src/PropertyDialog.cpp
+++ b/Viewer/src/PropertyDialog.cpp
@@ -142,6 +142,26 @@ void PropertyDialog::slotButton(QAbstractButton* pb)
 	}
 }
 
+void PropertyDialog::showPage(QString path)
+{
+    QStringList lst=path.split(".");
+    if(lst.count() > 0)
+    {
+        QString pageName=lst[0];
+        for(int i=0; i < editors_.count(); i++)
+        {
+            PropertyEditor *ed=editors_[i];
+            if(VProperty* prop=ed->property())
+            {
+                if(prop->name() == pageName)
+                {
+                    list_->setCurrentRow(i);
+                    return;
+                }
+            }
+        }
+    }
+}
 
 void PropertyDialog::manageChange(bool inApply)
 {
diff --git a/Viewer/src/PropertyDialog.hpp b/Viewer/src/PropertyDialog.hpp
index 355d1dd..e20fe99 100644
--- a/Viewer/src/PropertyDialog.hpp
+++ b/Viewer/src/PropertyDialog.hpp
@@ -26,9 +26,10 @@ Q_OBJECT
     
 public:
     explicit PropertyDialog(QWidget *parent=0);
-    ~PropertyDialog() {};
+    ~PropertyDialog() {}
 
     bool isConfigChanged() const {return configChanged_;}
+    void showPage(QString);
 
     //Called from VConfigLoader
     static void load(VProperty*);
diff --git a/Viewer/src/PropertyDialog.ui b/Viewer/src/PropertyDialog.ui
index 1f0db9e..33b88cd 100644
--- a/Viewer/src/PropertyDialog.ui
+++ b/Viewer/src/PropertyDialog.ui
@@ -11,7 +11,7 @@
    </rect>
   </property>
   <property name="windowTitle">
-   <string>Configuration</string>
+   <string>Preferences</string>
   </property>
   <property name="modal">
    <bool>true</bool>
@@ -20,7 +20,16 @@
    <property name="spacing">
     <number>2</number>
    </property>
-   <property name="margin">
+   <property name="leftMargin">
+    <number>2</number>
+   </property>
+   <property name="topMargin">
+    <number>2</number>
+   </property>
+   <property name="rightMargin">
+    <number>2</number>
+   </property>
+   <property name="bottomMargin">
     <number>2</number>
    </property>
    <item>
@@ -28,7 +37,16 @@
      <property name="spacing">
       <number>4</number>
      </property>
-     <property name="margin">
+     <property name="leftMargin">
+      <number>2</number>
+     </property>
+     <property name="topMargin">
+      <number>2</number>
+     </property>
+     <property name="rightMargin">
+      <number>2</number>
+     </property>
+     <property name="bottomMargin">
       <number>2</number>
      </property>
      <item>
diff --git a/Viewer/src/PropertyEditor.cpp b/Viewer/src/PropertyEditor.cpp
index 477d0d5..8b613df 100644
--- a/Viewer/src/PropertyEditor.cpp
+++ b/Viewer/src/PropertyEditor.cpp
@@ -520,7 +520,6 @@ void PropertyEditor::addTabs(VProperty* vProp,QVBoxLayout *layout,QWidget* paren
     t->setObjectName("tab");
     layout->addWidget(t);
    
-    int col=1;
     Q_FOREACH(VProperty* chProp,vProp->children())
     {
         if(chProp->name() == "tab")
diff --git a/Viewer/src/PropertyLine.cpp b/Viewer/src/PropertyLine.cpp
index bc17091..2f1ef6b 100644
--- a/Viewer/src/PropertyLine.cpp
+++ b/Viewer/src/PropertyLine.cpp
@@ -291,6 +291,7 @@ VProperty* PropertyLine::ruleProperty()
             }
         }
     }
+    return 0;
 }
 
 void PropertyLine::addRuleLine(PropertyLine *r)
diff --git a/Viewer/src/PropertyMapper.cpp b/Viewer/src/PropertyMapper.cpp
index 07274ba..481af4c 100644
--- a/Viewer/src/PropertyMapper.cpp
+++ b/Viewer/src/PropertyMapper.cpp
@@ -1,7 +1,16 @@
+//============================================================================
 // Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 "PropertyMapper.hpp"
 
+#include "UIDebug.hpp"
 #include "VConfig.hpp"
 
 PropertyMapper::PropertyMapper(const std::vector<std::string>&  names,VPropertyObserver* obs) : obs_(obs)
@@ -24,7 +33,7 @@ PropertyMapper::~PropertyMapper()
 	}
 }
 
-VProperty* PropertyMapper::find(const std::string& path) const
+VProperty* PropertyMapper::find(const std::string& path,bool failOnError) const
 {
 	for(std::vector<VProperty*>::const_iterator it=props_.begin(); it != props_.end(); ++it)
 	{
@@ -32,5 +41,8 @@ VProperty* PropertyMapper::find(const std::string& path) const
 			return *it;
 	}
 
+    if(failOnError)
+        UI_ASSERT(0,"Could not find property=" + path);
+
 	return 0;
 }
diff --git a/Viewer/src/PropertyMapper.hpp b/Viewer/src/PropertyMapper.hpp
index b1245cd..6442efc 100644
--- a/Viewer/src/PropertyMapper.hpp
+++ b/Viewer/src/PropertyMapper.hpp
@@ -1,17 +1,24 @@
+//============================================================================
 // Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 PROPERTYMAPPER_INC_
 #define PROPERTYMAPPER_INC_
 
 #include "VProperty.hpp"
 
-
 class PropertyMapper
 {
 public:
     PropertyMapper(const std::vector<std::string>&,VPropertyObserver* obs);
     ~PropertyMapper();
-    VProperty* find(const std::string& path) const;
+    VProperty* find(const std::string& path,bool failOnError=false) const;
 
 private:
     VPropertyObserver* obs_;
diff --git a/Viewer/src/RepeatEditor.cpp b/Viewer/src/RepeatEditor.cpp
index dc60014..2c580ee 100644
--- a/Viewer/src/RepeatEditor.cpp
+++ b/Viewer/src/RepeatEditor.cpp
@@ -22,6 +22,7 @@
 #include "VAttributeType.hpp"
 #include "ServerHandler.hpp"
 #include "SessionHandler.hpp"
+#include "UiLog.hpp"
 #include "VInfo.hpp"
 #include "VNode.hpp"
 #include "VRepeatAttr.hpp"
@@ -96,7 +97,7 @@ RepeatEditor::RepeatEditor(VInfo_ptr info,QWidget* parent) :
     valueLe_->setValidator(validator);
 #endif
 
-    header_->setInfo(QString::fromStdString(info_->path()),"Repeat " + QString::fromStdString(rep->subType()));
+    header_->setInfo(QString::fromStdString(info_->nodePath()),"Repeat " + QString::fromStdString(rep->subType()));
 
     readSettings();
 }
@@ -122,7 +123,7 @@ void RepeatEditor::buildList(VRepeatAttr *rep)
     int cnt=end-start;
     if(cnt >1)
     {
-        for(size_t i=start; i < end; i++)
+        for(int i=start; i <= end; i++)
             modelData_ << QString::fromStdString(rep->value(i));
 
         model_=new QStringListModel(this);
@@ -201,7 +202,8 @@ RepeatIntEditor::RepeatIntEditor(VInfo_ptr info,QWidget* parent) :
     //    return;
 
     w_->hideRow(w_->valueLe_);
-    w_->valueSpin_->setValue(oriVal_.toInt());
+
+    initSpinner();
 
     connect(w_->valueSpin_,SIGNAL(valueChanged(int)),
             this,SLOT(slotValueChanged(int)));
@@ -209,6 +211,38 @@ RepeatIntEditor::RepeatIntEditor(VInfo_ptr info,QWidget* parent) :
     checkButtonStatus();
 }
 
+void RepeatIntEditor::initSpinner()
+{
+    w_->valueSpin_->setValue(oriVal_.toInt());
+
+    VAttribute* a=info_->attribute();
+
+    Q_ASSERT(a);
+    Q_ASSERT(a->type());
+    Q_ASSERT(a->type()->name() == "repeat");
+
+    VRepeatAttr *rep=static_cast<VRepeatAttr*>(a);
+
+    int startIndex=rep->startIndex();
+    int endIndex=rep->endIndex();
+    int step=rep->step();
+
+    if(step<=0 || endIndex <= startIndex)
+    {
+        return;
+    }
+
+    int minVal=QString::fromStdString(rep->value(startIndex)).toInt();
+    int maxVal=QString::fromStdString(rep->value(endIndex)).toInt();
+
+#if 0
+    UiLog().dbg() << "min=" << minVal << " max=" << maxVal << " step=" << step;
+#endif
+    w_->valueSpin_->setMinimum(minVal);
+    w_->valueSpin_->setMaximum(maxVal);
+    w_->valueSpin_->setSingleStep(step);
+}
+
 void RepeatIntEditor::setValue(QString val)
 {
    w_->valueSpin_->setValue(val.toInt());
diff --git a/Viewer/src/RepeatEditor.hpp b/Viewer/src/RepeatEditor.hpp
index 5bc9bd3..bb89666 100644
--- a/Viewer/src/RepeatEditor.hpp
+++ b/Viewer/src/RepeatEditor.hpp
@@ -47,7 +47,7 @@ protected Q_SLOTS:
 
 protected:
     void buildList(VRepeatAttr *rep);
-    bool isListMode() const;   
+    bool isListMode() const;
     virtual void setValue(QString)=0;
     void readSettings();
     void writeSettings();
@@ -68,7 +68,8 @@ public:
 protected Q_SLOTS:
     void slotValueChanged(int);
 
-protected:
+protected:    
+    void initSpinner();
     void apply();
     void setValue(QString val);
     void resetValue();
diff --git a/Viewer/src/RepeatEditorWidget.ui b/Viewer/src/RepeatEditorWidget.ui
index 1d23732..75fc357 100644
--- a/Viewer/src/RepeatEditorWidget.ui
+++ b/Viewer/src/RepeatEditorWidget.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>329</width>
-    <height>227</height>
+    <width>467</width>
+    <height>390</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -93,7 +93,17 @@
     <widget class="QLineEdit" name="valueLe_"/>
    </item>
    <item row="6" column="1">
-    <widget class="QListView" name="valueView_"/>
+    <widget class="QListView" name="valueView_">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>1</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="resizeMode">
+      <enum>QListView::Fixed</enum>
+     </property>
+    </widget>
    </item>
    <item row="4" column="0">
     <widget class="QLabel" name="label_5">
diff --git a/Viewer/src/RichTextSearchInterface.cpp b/Viewer/src/RichTextSearchInterface.cpp
index cae33c3..2a4f80c 100644
--- a/Viewer/src/RichTextSearchInterface.cpp
+++ b/Viewer/src/RichTextSearchInterface.cpp
@@ -147,7 +147,7 @@ void RichTextSearchInterface::automaticSearchForKeywords(bool userClickedReload)
         // search direction
         QTextDocument::FindFlags findFlags;
         QTextCursor cursor(editor_->textCursor());
-        std::string searchFrom = vpAutomaticSearchFrom_->valueAsString();
+        std::string searchFrom = vpAutomaticSearchFrom_->valueAsStdString();
         QTextCursor::MoveOperation move;
         if (searchFrom == "bottom")
         {
@@ -165,11 +165,11 @@ void RichTextSearchInterface::automaticSearchForKeywords(bool userClickedReload)
             findFlags = findFlags | QTextDocument::FindCaseSensitively;
 
         // string match mode
-        std::string matchMode(vpAutomaticSearchMode_->valueAsString());
+        std::string matchMode(vpAutomaticSearchMode_->valueAsStdString());
         StringMatchMode::Mode mode = StringMatchMode::operToMode(matchMode);
 
         // the term to be searched for
-        std::string searchTerm_s(vpAutomaticSearchText_->valueAsString());
+        std::string searchTerm_s(vpAutomaticSearchText_->valueAsStdString());
         QString searchTerm = QString::fromStdString(searchTerm_s);
 
         // perform the search
diff --git a/Viewer/src/ScriptItemWidget.cpp b/Viewer/src/ScriptItemWidget.cpp
index a94379c..93ef565 100644
--- a/Viewer/src/ScriptItemWidget.cpp
+++ b/Viewer/src/ScriptItemWidget.cpp
@@ -29,7 +29,8 @@ ScriptItemWidget::ScriptItemWidget(QWidget *parent) : CodeItemWidget(parent)
     //Remove the first spacer item!!
     removeSpacer();
     
-    Highlighter* ih=new Highlighter(textEdit_->document(),"script");
+    //The document becomes the owner of the highlighter
+    new Highlighter(textEdit_->document(),"script");
 
 	infoProvider_=new ScriptProvider(this);
 
diff --git a/Viewer/src/ServerComInfoWidget.cpp b/Viewer/src/ServerComInfoWidget.cpp
new file mode 100644
index 0000000..080a0ad
--- /dev/null
+++ b/Viewer/src/ServerComInfoWidget.cpp
@@ -0,0 +1,1232 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 "ServerComInfoWidget.hpp"
+
+#include <QAction>
+#include <QHBoxLayout>
+#include <QMouseEvent>
+#include <QPainter>
+#include <QTimer>
+#include <QToolButton>
+
+#include <cmath>
+
+#include <boost/current_function.hpp>
+
+#include "FontMetrics.hpp"
+#include "PropertyMapper.hpp"
+#include "ServerHandler.hpp"
+#include "ToolTipFormat.hpp"
+#include "UIDebug.hpp"
+#include "UiLog.hpp"
+#include "VNode.hpp"
+
+QIcon* ServerRefreshInfoWidget::icon_=0;
+QBrush ServerRefreshInfoWidget::buttonBgBrush_(QColor(229,228,227));
+QBrush ServerRefreshInfoWidget::serverBgBrush_(QColor(241,242,243));
+QPen ServerRefreshInfoWidget::borderPen_(QColor(197,197,197));
+QPen ServerRefreshInfoWidget::buttonBorderPen_(QColor(167,167,167));
+QPen ServerRefreshInfoWidget::disabledBorderPen_(QColor(182,182,182));
+QBrush ServerRefreshInfoWidget::buttonBgHoverBrush_(QColor(249,248,248));
+QPen ServerRefreshInfoWidget::buttonHoverPen_(QColor(160,160,160));
+QBrush ServerRefreshInfoWidget::buttonBgRefreshBrush_(QColor(214,227,213));
+QBrush ServerRefreshInfoWidget::periodBgBrush_(QColor(241,242,243));
+QBrush ServerRefreshInfoWidget::progBrush_(QColor(117,165,230));
+QBrush ServerRefreshInfoWidget::progBgBrush_(QColor(255,255,255));
+QBrush ServerRefreshInfoWidget::lastBgBrush_(QColor(238,238,238));
+QPen ServerRefreshInfoWidget::buttonRefreshPen_(QColor(79,179,100),2);
+QPen ServerRefreshInfoWidget::serverTextPen_(QColor(80,80,80));
+QPen ServerRefreshInfoWidget::periodTextPen_(QColor(45,45,45));
+QPen ServerRefreshInfoWidget::driftTextPen_(QColor(120,120,120));
+QPen ServerRefreshInfoWidget::lastTextPen_(QColor(45,45,45));
+QPen ServerRefreshInfoWidget::disabledTextPen_(QColor(180,180,180));
+
+//#define _UI_SERVERCOMINFOWIDGET_DEBUG
+
+#if 0
+ServerRefreshInfoWidget::ServerRefreshInfoWidget(QAction* refreshAction,QWidget *parent) :
+    QWidget(parent),
+    refreshAction_(refreshAction)
+{
+    Q_ASSERT(refreshAction_);
+
+    QHBoxLayout *hb=new QHBoxLayout(this);
+    hb->setContentsMargins(0,0,0,0);
+    hb->setSpacing(0);
+
+    //QToolButton* refreshTb=new QToolButton(this);
+   //refreshTb->setAutoRaise(true);
+    //refreshTb->setDefaultAction(refreshAction_);
+    //hb->addWidget(refreshTb);
+
+    infoW_=new ServerComLineDisplay(this);
+    hb->addWidget(infoW_);
+
+    IconProvider::add(":/viewer/reload_one.svg","reload_one");
+
+
+}
+#endif
+
+ServerRefreshInfoWidget::ServerRefreshInfoWidget(QAction* refreshAction,QWidget *parent) :
+    QWidget(parent),
+    refreshAction_(refreshAction),
+    server_(0),
+    fontServer_(QFont()),
+    fontPeriod_(QFont()),
+    fontLast_(QFont()),
+    fmServer_(QFont()),
+    fmServerReal_(QFont()),
+    fmPeriod_(QFont()),
+    fmLast_(QFont()),
+    periodTextWidth_(0),
+    periodTextWidthMin_(0),
+    periodDummyText_(" D=300s "),
+    periodDummyFullText_(" D=300s d=99s"),
+    currentComponent_(NoComponent),
+    progRectHeight_(2),
+    serverRectHeight_(10),
+    serverYPadding_(2),
+    prop_(0),
+    mode_(NoMode),
+    noBlinkLimit_(15),
+    hasInfo_(false),
+    inRefresh_(true),
+    userInitiatedRefresh_(false),
+    showLastAutoRefresh_(true),
+    total_(-1),
+    period_(-1),
+    toNext_(-1),
+    drift_(-1),
+    needBorder_(true)
+{
+    Q_ASSERT(refreshAction_);
+
+    //The icon for the round refresh button
+    if(!icon_)
+        icon_=new QIcon(QPixmap(":/viewer/reload_green.svg"));
+
+    //Init fonts
+    fontServer_=QFont();
+    fontServer_.setPointSize(fontServer_.pointSize()-1);
+    fontServer_.setBold(true);
+    fmServer_=QFontMetrics(fontServer_);
+    fmServerReal_=FontMetrics(fontServer_);
+
+    fontPeriod_=QFont();
+    fontPeriod_.setPointSize(fontPeriod_.pointSize()-2);
+    fmPeriod_=QFontMetrics(fontPeriod_);
+
+    fontLast_=QFont();
+    fontLast_.setPointSize(fontLast_.pointSize()-2);
+    fmLast_=QFontMetrics(fontLast_);
+
+    int w=200;
+    serverRectHeight_=fmServerReal_.realHeight()+2*serverYPadding_;
+    int h=serverRectHeight_+2*4;
+
+    //timer
+    timer_=new QTimer(this);
+
+    connect(timer_,SIGNAL(timeout()),
+            this,SLOT(slotTimeOut()));
+
+    //set size
+    setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Minimum);
+    setMinimumSize(w,h);
+
+    buttonRect_=QRect(1,1,h-2,h-2);
+    buttonRadius2_=pow(buttonRect_.width()/2,2);
+
+    adjustGeometry(false);
+
+    //we need this for the mousemove event
+    setMouseTracking(true);
+
+    //properties to use
+    std::vector<std::string> propVec;
+    propVec.push_back("server.update.blinkUpdateButtonLimit");
+    propVec.push_back("server.update.showLastRefreshTimeInAutoMode");
+    prop_=new PropertyMapper(propVec,this);
+    updateSettings();
+}
+
+ServerRefreshInfoWidget::~ServerRefreshInfoWidget()
+{
+    //Detach from the server
+    if(server_)
+    {
+        server_->removeServerObserver(this);
+        server_->removeServerComObserver(this);
+    }
+    delete prop_;
+}
+
+bool ServerRefreshInfoWidget::isActionEnabled() const
+{
+    return refreshAction_->isEnabled();
+}
+
+void ServerRefreshInfoWidget::notifyChange(VProperty* p)
+{
+    updateSettings();
+}
+
+void ServerRefreshInfoWidget::updateSettings()
+{ 
+    bool fetched=false;
+    bool changed=false;
+    if(VProperty* p=prop_->find("server.update.showLastRefreshTimeInAutoMode"))
+    {
+        bool v=p->value().toBool();
+        if(showLastAutoRefresh_!= v)
+        {
+            showLastAutoRefresh_=v;
+            adjustGeometry(true);
+            fetched=true;
+            changed=true;
+        }
+    }
+
+    if(VProperty* p=prop_->find("server.update.blinkUpdateButtonLimit"))
+    {
+        int v=p->value().toInt();
+        if(noBlinkLimit_ != v)
+        {
+            noBlinkLimit_=v;
+            changed=true;
+        }
+    }
+
+    if(changed)
+    {
+        if(!fetched)
+        {
+            fetchInfo();
+        }
+        update();
+    }
+}
+
+void ServerRefreshInfoWidget::setServer(ServerHandler* server)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+     UI_FUNCTION_LOG
+#endif
+
+    if(server_ != server && server_)
+    {
+        server_->removeServerObserver(this);
+        server_->removeServerComObserver(this);
+    }
+
+    server_=server;
+
+    if(server_)
+    {
+        server_->addServerObserver(this);
+        server_->addServerComObserver(this);
+    }
+    else
+    {
+        hasInfo_=0;
+    }
+
+    refreshAction_->setEnabled(true);
+    inRefresh_=false;
+    userInitiatedRefresh_=false;
+    mode_=NoMode;
+
+    //Cache some data
+    serverName_.clear();
+    serverText_.clear();
+    if(server_)
+    {
+        serverName_=QString::fromStdString(server_->name());
+        serverText_=" " + serverName_ + " ";
+    }
+
+    periodText_.clear();
+    driftText_.clear();
+    periodTextWidthMin_=0;
+    periodTextWidth_=0;
+    lastTextWidth_=0;
+
+    //Adjust width + get info
+    adjustGeometry(true);
+
+    //rerender
+    update();
+}
+
+//-------------------------------
+// Server observer notifications
+//-------------------------------
+
+void ServerRefreshInfoWidget::notifyServerDelete(ServerHandler* server)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+#endif
+
+    Q_ASSERT(server_ == server);
+    if(server_ == server)
+    {
+        server_->removeServerObserver(this);
+        server_->removeServerComObserver(this);
+        server_=0;
+        serverName_.clear();
+        serverText_.clear();
+        hasInfo_=false;
+        mode_=NoMode;
+        inRefresh_=false;
+        userInitiatedRefresh_=false;
+        periodText_.clear();
+        driftText_.clear();
+        periodTextWidthMin_=0;
+        periodTextWidth_=0;
+        lastTextWidth_=0;
+
+        refreshAction_->setEnabled(false);
+
+        //get info and rerender
+        reloadAll();
+
+        adjustGeometry(false);
+    }
+}
+
+//While the server is being reloaded the refresh button is disabled. It must be followed by a
+//notifyEndServerScan() call!
+void ServerRefreshInfoWidget::notifyBeginServerClear(ServerHandler* server)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    Q_ASSERT(server_ == server);
+    timer_->stop();
+    refreshAction_->setEnabled(false);
+    hasInfo_=false;
+    inRefresh_=false;
+    userInitiatedRefresh_=false;
+    mode_=NoMode;
+    periodText_.clear();
+    driftText_.clear();
+    periodTextWidthMin_=0;
+    periodTextWidth_=0;
+    lastTextWidth_=0;
+
+    update();
+}
+
+//The server has been reloaded. We must get the current state.
+void ServerRefreshInfoWidget::notifyEndServerScan(ServerHandler* server)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    Q_ASSERT(server_ == server);
+    refreshAction_->setEnabled(true);
+    reloadAll();
+}
+
+//virtual void notifyServerConnectState(ServerHandler* server) {}
+void ServerRefreshInfoWidget::notifyServerActivityChanged(ServerHandler* /*server*/)
+{
+
+}
+
+//-----------------------------------
+// Server com observer notifications
+//-----------------------------------
+
+void ServerRefreshInfoWidget::notifyRefreshTimerStarted(ServerHandler* server)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    Q_ASSERT(server_ == server);
+    reloadAll(); //get info and rerender
+}
+
+void ServerRefreshInfoWidget::notifyRefreshTimerStopped(ServerHandler* server)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    Q_ASSERT(server_ == server);
+    reloadAll(); //get info and rerender
+}
+
+void ServerRefreshInfoWidget::notifyRefreshTimerChanged(ServerHandler* server)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+    printStatus();
+#endif
+    Q_ASSERT(server_ == server);
+
+    //if we are in refresh we do not want to fetch any new information unless we are in
+    //NoMode
+    if(!inRefresh_ || mode_==NoMode)
+    {
+        reloadAll(); //get info and rerender
+    }
+}
+
+//While the refresh is being executed the the refresh button
+void ServerRefreshInfoWidget::notifyRefreshScheduled(ServerHandler* server)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    Q_ASSERT(server_ == server);
+    inRefresh_=true;
+    inRefreshElapsed_.restart();
+    if(mode_ == NormalMode)
+    {        
+        timer_->stop();
+
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+        printStatus();
+#endif
+        //redraw
+        update();
+    }
+}
+
+void ServerRefreshInfoWidget::notifyRefreshFinished(ServerHandler* server)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    Q_ASSERT(server_ == server);
+    int elapsed=inRefreshElapsed_.elapsed();
+
+    if((mode_ == NormalMode) && elapsed < 450)
+    {
+        Q_ASSERT(500-elapsed > 0);
+        //We keep the button in inRefresh state for 0.5 sec (the timer is stopped now!!)
+        QTimer::singleShot(500-elapsed,this,SLOT(slotTimeOutRefreshFinished()));
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+        printStatus();
+#endif
+    }
+    else
+    {
+        inRefresh_=false;
+        userInitiatedRefresh_=false;
+    }
+}
+
+void ServerRefreshInfoWidget::reloadAll()
+{
+    fetchInfo(); //get info
+    update();    //renrender
+}
+
+void ServerRefreshInfoWidget::slotTimeOut()
+{
+    reloadAll();
+}
+
+void ServerRefreshInfoWidget::slotTimeOutRefreshFinished()
+{
+    inRefresh_=false;
+    userInitiatedRefresh_=false;
+    reloadAll();
+}
+
+void ServerRefreshInfoWidget::fetchInfo()
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+    printStatus();
+#endif
+
+    if(!server_)
+    {
+        mode_=NoMode;
+        hasInfo_=false;
+        timer_->stop();
+    }
+    else
+    {
+        QDateTime currentTime=QDateTime::currentDateTime();
+        bool v=server_->updateInfo(period_,total_,drift_,toNext_);
+
+        bool geoUpdateNeeded=(v != hasInfo_);
+        hasInfo_=v;
+
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+        UiLog().dbg() << " period=" << period_ << " total=" << total_ <<
+                         " toNext=" << toNext_;
+#endif
+
+        //the server has an automatic update
+        if(hasInfo_)
+        {
+            lastRefresh_=server_->lastRefresh().time().toString(); //currentTime.addSecs(-total_+toNext_).time().toString();
+            nextRefresh_=currentTime.addSecs(toNext_).time().toString();
+
+            mode_=NormalMode;
+            if(!inRefresh_)
+                refreshAction_->setEnabled(true);
+        }
+        //the server's automatic refresh is switched off
+        else
+        {
+            lastRefresh_=server_->lastRefresh().time().toString();
+            mode_=ManualMode;
+            if(!inRefresh_)
+                refreshAction_->setEnabled(true);
+        }
+
+        //Determine period text
+        determinePeriodText();
+
+        if(geoUpdateNeeded || periodTextWidthAboutToChange())
+            adjustGeometry(false);
+
+        //if(currentComponent_ == TextComponent)
+        adjustToolTip();
+
+        adjustTimer(toNext_);
+    }
+
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    printStatus();
+#endif
+}
+
+//Adjust timer interval
+void ServerRefreshInfoWidget::adjustTimer(int toNext)
+{
+    //we stop the timer when:
+    // -the action is disabled
+    // -we are in fast mode
+    // -the countdown is not shown
+    if(!refreshAction_->isEnabled() || mode_ == NoMode || mode_ == ManualMode)
+    {
+        timer_->stop();
+
+    }
+    else if(hasInfo_)
+    {
+        if(total_ <= 1)
+        {
+            timer_->stop();
+            return;
+        }
+        else if(total_==2)
+           timer_->setInterval(750);
+        else
+        {
+            Q_ASSERT(total_ > 0);
+            int progWidth=periodTextWidth_;
+            Q_ASSERT(progWidth > 0);
+            float secPerPix=static_cast<float>(total_)/static_cast<float>(progWidth);
+            float r=ceil(secPerPix);
+            Q_ASSERT(r >= 1.);
+
+            if(toNext > 135)
+            {
+                if(r > 30)
+                    r=60;
+                else if(r > 15)
+                    r=30;
+                else
+                    r=15;
+            }
+            else if(toNext > 60)
+            {
+                if(r < 10)
+                    r=10;
+            }
+            else if(toNext > 30)
+            {
+                if(r < 5)
+                    r=5;
+            }
+            else if(toNext > 5)
+            {
+                if(r < 2.5)
+                    r=2.5;
+            }
+            else
+            {
+                r=1;
+            }
+
+            timer_->setInterval(static_cast<int>(r*1000.));
+        }
+
+        if(!timer_->isActive())
+            timer_->start();
+    }
+    else
+    {
+        timer_->stop();
+    }
+}
+
+//Check if a point is inside the (round) button
+bool ServerRefreshInfoWidget::isInButton(const QPoint& pos) const
+{
+    QPoint d=pos-buttonRect_.center();
+    return d.x()*d.x()+d.y()*d.y() <= buttonRadius2_;
+}
+
+bool ServerRefreshInfoWidget::isInText(const QPoint& pos) const
+{
+    return (pos.x() > buttonRect_.right());
+}
+
+void ServerRefreshInfoWidget::resizeEvent(QResizeEvent* event)
+{
+    buttonRect_=QRect(1,1,height()-2,height()-2);
+    buttonRadius2_=pow(buttonRect_.width()/2,2);
+}
+
+void ServerRefreshInfoWidget::mouseDoubleClickEvent(QMouseEvent* event)
+{
+    if(server_ && !isInButton(event->pos()))
+    {
+        Q_EMIT serverSettingsEditRequested(server_);
+    }
+}
+
+void ServerRefreshInfoWidget::mousePressEvent(QMouseEvent* event)
+{
+    if(!refreshAction_->isEnabled())
+        return;
+
+    //We are in the button
+    if(isInButton(event->pos()))
+    {
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+//        UiLog().dbg() << "pressed";
+#endif
+        if(currentComponent_ != ButtonComponent)
+        {
+            currentComponent_ = ButtonComponent;
+        }
+        userInitiatedRefresh_=true;
+        refreshAction_->trigger();
+    }
+}
+
+void ServerRefreshInfoWidget::mouseMoveEvent(QMouseEvent* event)
+{
+    //We are in the button
+    if(isInButton(event->pos()))
+    {
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+//        UiLog().dbg() << "inButton";
+#endif
+        //we just entered the button
+        if(currentComponent_ != ButtonComponent)
+        {
+            currentComponent_=ButtonComponent;
+            adjustToolTip();
+            if(refreshAction_->isEnabled())
+            {
+                update(); //rerender
+            }
+        }
+    }
+    //We are in the progress part
+    else if(isInText(event->pos()))
+    {
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+//        UiLog().dbg() << "inText";
+#endif
+        //we came from the button
+        if(currentComponent_ == ButtonComponent)
+        {
+            currentComponent_=TextComponent;           
+            adjustToolTip();
+            if(refreshAction_->isEnabled())
+            {
+                update(); //rerender
+            }
+        }
+        //we came from outside
+        else if(currentComponent_ != TextComponent)
+        {
+            currentComponent_=TextComponent;            
+            adjustToolTip();
+        }
+    }
+}
+
+void ServerRefreshInfoWidget::leaveEvent(QEvent*)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    //UI_FUNCTION_LOG
+#endif
+    currentComponent_=NoComponent;
+    update(); //rerender
+}
+
+
+void ServerRefreshInfoWidget::paintEvent(QPaintEvent*)
+{
+    QPainter painter(this);
+    drawProgress(&painter);
+    drawButton(&painter);
+}
+
+
+QString ServerRefreshInfoWidget::formatPeriodTime(int timeInSec) const
+{
+    int h=timeInSec/3600;
+    int r=timeInSec%3600;
+    int m=r/60;
+    int s=r%60;
+
+    QTime t(h,m,s);
+    if(h > 0)
+       return QString::number(h) +  QString(":%1h").arg(m, 2, 10, QChar('0'));
+    else if(m >= 5)
+       return QString::number(m) +  QString(":%1s").arg(s, 2, 10, QChar('0'));
+    else if(m> 0)
+       return QString::number(m*60+s) + "s";
+    else
+       return QString::number(s) + "s";
+
+    return QString();
+}
+
+void ServerRefreshInfoWidget::determinePeriodText()
+{
+    periodText_.clear();
+    driftText_.clear();
+    if(hasInfo_)
+    {
+        //Unicode 916=Greek capital delta
+        periodText_=QString(" ") + QChar(916) + QString("=") + formatPeriodTime(total_) + " ";
+        if(drift_ > 0)
+        {
+            driftText_="d=" + formatPeriodTime(total_-period_) + " ";
+        }
+    }
+}
+
+QString ServerRefreshInfoWidget::fullPeriodText() const
+{
+    return periodText_+driftText_;
+}
+
+int ServerRefreshInfoWidget::determinePeriodTextWidthMin() const
+{
+    QString s=periodDummyText_;
+    if(hasInfo_ && drift_ > 0)
+    {
+        s=periodDummyFullText_;
+    }
+    return fmPeriod_.width(s);
+}
+
+//Indicate if the full period text's size will change in such a way that the
+//geometry needs to be adjusted
+bool ServerRefreshInfoWidget::periodTextWidthAboutToChange() const
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+#endif
+
+    int mval=determinePeriodTextWidthMin();
+
+    QString pt=fullPeriodText();
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UiLog().dbg() << " full=" << pt << " pt.size=" << pt.size() <<
+               " mval=" << mval << " periodTextWidthMin=" <<  periodTextWidthMin_ <<
+               " periodTextSize "  <<  periodTextWidth_;
+#endif
+    bool changed=false;
+    if(periodTextWidthMin_ == mval)
+    {
+        int w=fmPeriod_.width(pt);
+        if(w > periodTextWidth_)
+        {
+            changed=w > periodTextWidthMin_;
+        }
+        else if(w < periodTextWidth_)
+        {
+            changed=periodTextWidth_ >= periodTextWidthMin_;
+        }
+    }
+    else
+    {
+        changed=true;
+    }
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UiLog().dbg() << " changed=" << changed;
+#endif
+    return changed;
+}
+
+void ServerRefreshInfoWidget::adjustGeometry(bool doFetchInfo)
+{
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+    UI_FUNCTION_LOG
+#endif
+
+    if(server_)
+    {
+        //timeTextLen_=qMax(fmTime_.width(" <9:59m"),fmUpdate_.width("updating"));
+
+        //Define server rect
+        int h=serverRectHeight_; //fmServer_.height()+progRectHeight_; //;2*yPadding;
+        int currentRight=0;
+
+        serverRect_=QRect(buttonRect_.center().x()+4,(height()-h)/2,
+                          buttonRect_.width()/2-4+4+fmServer_.width(serverText_),
+                          h);
+        currentRight=serverRect_.x()+serverRect_.width();
+
+        if(doFetchInfo)
+            fetchInfo();
+
+        //Determine the minimum size for the period text
+        periodTextWidthMin_=determinePeriodTextWidthMin();
+
+        //Compute physical width of the period text
+        QString pt=fullPeriodText();
+        int w=fmPeriod_.width(pt);
+        if(w <= periodTextWidthMin_)
+        {
+            periodTextWidth_=periodTextWidthMin_;
+        }
+        else
+        {
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+            UiLog().dbg() << " width changed before=" <<  periodTextWidth_;
+#endif
+            periodTextWidth_=w;
+#ifdef _UI_SERVERCOMINFOWIDGET_DEBUG
+            UiLog().dbg() << " width changed after=" <<  periodTextWidth_;
+#endif
+
+        }
+        periodRect_=QRect();
+        progRect_=QRect();
+        lastRect_=QRect();
+
+        if(hasInfo_)
+        {
+            periodRect_ = serverRect_;
+            periodRect_.setX(serverRect_.x()+serverRect_.width());
+            periodRect_.setWidth(periodTextWidth_);
+            //periodRect_.setHeight(fmPeriod_.height()-2);
+            periodRect_.setHeight(serverRect_.height()-progRectHeight_);
+
+            currentRight+=periodRect_.width();
+
+            progRect_ = periodRect_;
+            progRect_.setY(periodRect_.y()+periodRect_.height());
+            progRect_.setHeight(serverRect_.height()-periodRect_.height());
+        }
+
+        lastTextWidth_=0;
+        if((hasInfo_ && showLastAutoRefresh_) || !hasInfo_)
+        {
+            //Compute physical width of the last refresh text
+            lastTextWidth_=fmLast_.width(" last: 22:22:22 ");
+
+            lastRect_ = QRect(currentRight,serverRect_.y(),lastTextWidth_,h);
+            currentRight+=lastRect_.width()+6;
+        }
+        else
+           currentRight+=6;
+
+        setFixedWidth(currentRight);
+    }
+    else
+    {
+        periodTextWidthMin_=0;
+        periodTextWidth_=0;
+        lastTextWidth_=0;
+        setFixedWidth(buttonRect_.x()+buttonRect_.width()+4);
+    }
+}
+
+
+void ServerRefreshInfoWidget::drawButton(QPainter* painter)
+{
+    painter->setRenderHint(QPainter::Antialiasing,true);
+
+    if(server_)
+    {
+        //blink
+        if(inRefresh_ &&
+           ((mode_ == NormalMode && period_ >= noBlinkLimit_) ||
+             userInitiatedRefresh_ || mode_ == ManualMode ))
+        {
+            painter->setBrush(buttonBgRefreshBrush_);
+            painter->setPen(buttonRefreshPen_);
+        }
+        else
+        {
+            painter->setBrush((currentComponent_ == ButtonComponent)?buttonBgHoverBrush_:buttonBgBrush_);
+
+            if(!refreshAction_->isEnabled())
+                painter->setPen(disabledBorderPen_);
+            else
+                painter->setPen((currentComponent_ == ButtonComponent)?buttonHoverPen_:buttonBorderPen_);
+        }
+    }
+    else
+    {
+        painter->setBrush(buttonBgBrush_);
+        painter->setPen(buttonBorderPen_);
+    }
+
+    //The filled circle
+    painter->drawEllipse(buttonRect_);
+
+    //The reload icon
+    QRect r1=buttonRect_.adjusted(2,2,-2,-2);
+    QRect r2=r1.adjusted(3,3,-3,-3);
+    QPixmap pix=icon_->pixmap(QSize(r2.width(),r2.width()),
+                             refreshAction_->isEnabled()? QIcon::Normal: QIcon::Disabled);
+    painter->drawPixmap(r2,pix);
+}
+
+void ServerRefreshInfoWidget::drawProgress(QPainter* painter)
+{
+     if(!server_)
+         return;
+
+    //server bg
+    painter->setBrush(serverBgBrush_);
+    painter->drawRect(serverRect_);
+
+    if(needBorder_)
+    {
+        painter->setBrush(Qt::NoBrush);
+        painter->setPen((refreshAction_->isEnabled())?borderPen_:disabledBorderPen_);
+        painter->drawRect(serverRect_);
+    }
+
+    //Server text
+    QRect serverTextRect=serverRect_.adjusted(buttonRect_.width()/2-4+4,0,0,0);
+    painter->setFont(fontServer_);
+    painter->setPen((refreshAction_->isEnabled())?serverTextPen_:disabledTextPen_);   
+    painter->drawText(serverTextRect,Qt::AlignHCenter | Qt::AlignVCenter,serverText_);
+
+    //The time rects and texts
+    if(hasInfo_)
+    {
+        //backgrounds
+        painter->setPen(Qt::NoPen);
+        painter->setBrush(periodBgBrush_);
+        painter->drawRect(periodRect_);
+        painter->setBrush(progBgBrush_);
+        painter->drawRect(progRect_);
+
+        //border
+        if(needBorder_)
+        {
+            painter->setPen((refreshAction_->isEnabled())?borderPen_:disabledBorderPen_);
+            painter->setBrush(Qt::NoBrush);
+            painter->drawRect(periodRect_.adjusted(0,0,0,progRect_.height()));
+        }
+
+        painter->setFont(fontPeriod_);
+
+        //period + drift text
+        if(drift_ > 0)
+        {
+            int tw=fmPeriod_.width(fullPeriodText());
+            int w=periodRect_.width();
+            QRect rr=periodRect_.adjusted((w-tw)/2,0,-(w-tw)/2,0);
+
+            painter->setPen(periodTextPen_);
+            painter->drawText(rr,Qt::AlignLeft | Qt::AlignVCenter,periodText_);
+            painter->setPen(driftTextPen_);
+            painter->drawText(rr,Qt::AlignRight| Qt::AlignVCenter,driftText_);
+        }
+        else
+        {
+            painter->setPen(periodTextPen_);
+            painter->drawText(periodRect_,Qt::AlignHCenter | Qt::AlignVCenter,periodText_);
+        }
+
+        //Progress
+        float progress;
+        QRect actProgRect=progRect_;
+
+        if(total_ < 2 || inRefresh_)
+            progress=1;
+        else
+        {
+            UI_ASSERT(total_ != 0, "total_=" << total_);
+            progress=(static_cast<float>(total_-toNext_)/static_cast<float>(total_));
+            UI_ASSERT(progress >= 0. && progress <= 1.0001, "progress=" << progress);
+            if(progress >= 1.) progress=1;
+
+            int progressW=static_cast<int>(static_cast<float>(actProgRect.width())*progress);
+            if(progressW <0) progressW=0;
+            else if(progressW > progRect_.width()) progressW=progRect_.width();
+            actProgRect.setWidth(progressW);
+        }
+
+        painter->setPen((refreshAction_->isEnabled())?borderPen_:disabledBorderPen_);
+        painter->drawLine(progRect_.topLeft(),progRect_.topRight());
+
+        painter->fillRect(actProgRect,progBrush_);
+    }
+
+    //last refresh time
+    if((hasInfo_ && showLastAutoRefresh_) || !hasInfo_)
+    {
+        painter->setBrush(lastBgBrush_);
+        painter->setPen((refreshAction_->isEnabled())?borderPen_:disabledBorderPen_);
+        painter->drawRect(lastRect_);
+
+        painter->setFont(fontLast_);
+        painter->setPen(lastTextPen_);
+        painter->drawText(lastRect_,Qt::AlignHCenter | Qt::AlignVCenter,"last: " + lastRefresh_);
+     }
+}
+
+void ServerRefreshInfoWidget::adjustToolTip()
+{
+    QString txt;
+
+    /*
+    if(mode_ == ContMode)
+    {
+        Q_ASSERT(server_);
+        Q_ASSERT(hasInfo_);
+        txt=tr("Refresh period is too short! Manual refreshing is disabled for server <b>") +
+                serverName_ +
+                "</b><br>--------------------------------------------"+
+                tr("<br><b>Refresh period:</b> ") + QString::number(total_) + "s" +
+                " (base=" + QString::number(period_) + "s" + ",drifted=" + QString::number(total_-period_) +"s)";
+
+    }
+    */
+    if(1)
+    {
+        if(currentComponent_ == ButtonComponent)
+        {
+            if(!server_)
+            {
+                txt=tr("Refresh <b>selected</b> server ");
+            }
+            else
+            {
+                txt=tr("Refresh server <b>") + serverName_ +"</b> ";
+            }
+
+            txt+=Viewer::formatShortCut(refreshAction_);
+        }
+
+        if(hasInfo_)
+        {
+            Q_ASSERT(server_);
+            if(!txt.isEmpty())
+                txt+="<br>--------------------------------------------";
+            else
+                txt+="<b>Server:</b> " + serverName_;
+
+            txt+="<br><b>Last refresh:</b> " + lastRefresh_ +
+                "<br><b>Next refresh:</b> " + nextRefresh_ +
+                "<br><b>Total refresh period:</b> " + QString::number(total_) + "s" +
+                " (base=" + QString::number(period_) + "s" + ",drifted=" + QString::number(total_-period_) +"s)";
+
+            /*if(drift_ > 0)
+            {
+                txt+="<br>--------------------------------------------<br>";
+                txt+="When <b>drift</b> is enabled the server refresh period is increased at every automatic refresh until \
+                      the maximum period is reached. The drift is reset to zero when the user interacts with the server.";
+
+            }*/
+
+
+        }
+        else if(server_)
+        {
+            if(!txt.isEmpty())
+                txt+="<br>--------------------------------------------";
+            else
+                txt+="<b>Server:</b> " + serverName_;
+
+            txt+="<br><b>Last refresh:</b> " + lastRefresh_ + "<br>" +
+                 "Automatic refresh is disabled!";
+
+        }
+
+        if(currentComponent_ != ButtonComponent && server_)
+        {
+            txt+="<br>" + Viewer::formatShortCut("Double click to change refresh settings for server");
+        }
+    }
+
+    setToolTip(txt);
+}
+
+#if 0
+QString ServerRefreshInfoWidget::formatTime(int timeInSec) const
+{
+    int h=timeInSec/3600;
+    int r=timeInSec%3600;
+    int m=r/60;
+    int s=r%60;
+
+    QTime t(h,m,s);
+    if(h > 0)
+       return QString::number(h) + "h";
+    else if(m > 2)
+    {
+        if(s >= 30)
+            return QString::number(m+1) + "m";
+        else
+            return QString::number(m) + "m";
+    }
+    else if(m >= 1)
+    {
+        if(s >= 45)
+            return "1:45m";
+        else if(s >= 30)
+            return "1:30m";
+        else if(s >= 15)
+            return "1:15m";
+        else
+           return "1m";
+    }
+    else if(s > 50)
+       return "<1m";
+    else if(s > 45)
+       return "<50s";
+    else if(s > 40)
+        return "<45s";
+    else if(s > 35)
+       return "<40s";
+    else if(s > 30)
+       return "<35s";
+    else if(s > 25)
+       return "<30s";
+    else if(s > 20)
+        return "<25s";
+    else if(s > 15)
+       return "<20s";
+    else if(s > 10)
+       return "<15s";
+    else if(s > 5)
+        return "<10s";
+    else
+        return "<5s"; //return QString("%1s").arg(s, 2, 10, QChar('0'));
+
+    return QString();
+}
+#endif
+
+
+
+void ServerRefreshInfoWidget::printStatus() const
+{
+    UiLog().dbg()  << "  server=" << server_ << " action=" << refreshAction_->isEnabled() << " hasInfo=" << hasInfo_ <<
+                      " mode=" << mode_ << " inRefresh=" << inRefresh_ << " timer="  << timer_->isActive() <<
+                      " timeout=" << timer_->interval()/1000.  << "s";
+}
+
+ServerComActivityLine::ServerComActivityLine(QWidget *parent) :
+    QWidget(parent),
+    font_(QFont()),
+    fm_(font_),
+    server_(0)
+{
+    font_.setPointSize(font_.pointSize()-1);
+    fm_=QFontMetrics(font_);
+
+    int width_=200;
+    int height_=fm_.height()+4+6;
+
+    timer_=new QTimer(this);
+
+    connect(timer_,SIGNAL(timeout()),
+            this,SLOT(update()));
+
+    timer_->setInterval(1000);
+    timer_->start();
+
+    setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Minimum);
+    setMinimumSize(width_,height_);
+}
+
+void ServerComActivityLine::setServer(ServerHandler* server)
+{
+    server_=server;
+}
+
+void ServerComActivityLine::paintEvent(QPaintEvent*)
+{
+#if 0
+    if(!server_)
+        return;
+
+    int currentRight=0;
+    int offset=4;
+    int yPadding=2;
+
+    int period,total,drift,toNext;
+    bool hasUpdate=server_->updateInfo(period,total,drift,toNext);
+    bool hasDrift=(hasUpdate && drift > 0);
+    int h=height()-2*yPadding;
+    int progHeight=h;
+    int driftHeight=0;
+
+
+    if(hasDrift)
+    {
+        progHeight=fm_.height()+2;
+        driftHeight=h-progHeight;
+    }
+
+    //progress rect - with the server name in it
+    QRect progRect=QRect(offset,yPadding,
+                       fm_.width("ABCDEABDCEABCD"),
+                       progHeight);
+
+    QString progText=fm_.elidedText(QString::fromStdString(server_->name()),
+                               Qt::ElideRight,progRect.width());
+
+    //drif rect
+    QRect driftRect;
+    if(hasDrift)
+    {
+        driftRect=progRect;
+        driftRect.setY(yPadding+progHeight);
+        driftRect.setHeight(driftHeight);
+    }
+
+   //toNext rect
+   currentRight=progRect.x()+progRect.width()+offset;
+
+   QString toNextText=QString::number(total) + "s";
+   if(hasUpdate)
+       toNextText=formatTime(toNext);
+
+   QRect toNextRect=progRect;
+   toNextRect.setX(currentRight);
+   toNextRect.setWidth(fm_.wi
+
+#endif
+
+
+}
+
+
+
diff --git a/Viewer/src/ServerComInfoWidget.hpp b/Viewer/src/ServerComInfoWidget.hpp
new file mode 100644
index 0000000..a9d686e
--- /dev/null
+++ b/Viewer/src/ServerComInfoWidget.hpp
@@ -0,0 +1,205 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 SERVERCOMLINE_HPP
+#define SERVERCOMLINE_HPP
+
+#include <QBrush>
+#include <QIcon>
+#include <QPen>
+#include <QPixmap>
+#include <QTime>
+#include <QWidget>
+
+#include "FontMetrics.hpp"
+#include "ServerObserver.hpp"
+#include "ServerComObserver.hpp"
+#include "VProperty.hpp"
+
+class QAction;
+class QPainter;
+class QTimer;
+
+class PropertyMapper;
+class ServerHandler;
+class ServerUpdateData;
+
+
+class ServerRefreshInfoWidget : public QWidget, public ServerObserver, public ServerComObserver,
+                                public VPropertyObserver
+{
+Q_OBJECT
+
+public:
+    explicit ServerRefreshInfoWidget(QAction* refreshAction,QWidget* parent=0);
+    ~ServerRefreshInfoWidget();
+
+    void setServer(ServerHandler* server);
+
+    void notifyChange(VProperty* p);
+
+    void notifyDefsChanged(ServerHandler* server, const std::vector<ecf::Aspect::Type>& a) {}
+    void notifyServerDelete(ServerHandler* server);
+    void notifyBeginServerClear(ServerHandler*);
+    void notifyEndServerScan(ServerHandler*);
+    void notifyServerActivityChanged(ServerHandler*);
+
+    void notifyRefreshTimerStarted(ServerHandler* server);
+    void notifyRefreshTimerStopped(ServerHandler* server);
+    void notifyRefreshTimerChanged(ServerHandler* server);
+    void notifyRefreshScheduled(ServerHandler* server);
+    void notifyRefreshFinished(ServerHandler* server);
+
+protected Q_SLOTS:
+    void slotTimeOut();
+    void slotTimeOutRefreshFinished();
+
+Q_SIGNALS:
+     void serverSettingsEditRequested(ServerHandler*);
+
+protected:
+    void resizeEvent(QResizeEvent* event);
+    void mouseDoubleClickEvent(QMouseEvent* event);
+    void mousePressEvent(QMouseEvent* event);
+    void mouseMoveEvent(QMouseEvent* e);
+    void leaveEvent(QEvent*);
+    void paintEvent(QPaintEvent*);
+
+    void updateSettings();
+    void reloadAll();
+    void fetchInfo();
+    void drawButton(QPainter*);
+    void drawProgress(QPainter*);
+
+    QString formatPeriodTime(int timeInSec) const;
+    void determinePeriodText();
+    QString fullPeriodText() const;
+    int  determinePeriodTextWidthMin() const;
+    bool periodTextWidthAboutToChange() const;
+    void adjustGeometry(bool);
+    void adjustTimer(int toNext);
+    void adjustToolTip();
+
+    QString formatTime(int timeInSec) const;  
+    bool isInButton(const QPoint& pos) const;
+    bool isInText(const QPoint& pos) const;
+    void printStatus() const;
+    bool isActionEnabled() const;
+
+    enum Component {ButtonComponent,TextComponent,ConfigComponent,NoComponent};
+    enum Mode {NormalMode,ManualMode,NoMode};
+
+    QAction* refreshAction_;
+    ServerHandler* server_;
+    QString serverName_;
+    QString serverText_;
+    QTimer *timer_;
+    QTime inRefreshElapsed_;
+
+    QFont fontServer_;
+    QFont fontPeriod_;
+    QFont fontLast_;
+    QFontMetrics fmServer_;
+    FontMetrics fmServerReal_;
+    QFontMetrics fmPeriod_;
+    QFontMetrics fmLast_;
+
+    static QIcon *icon_;
+    static QPen   borderPen_;
+    static QPen   buttonBorderPen_;
+    static QPen   disabledBorderPen_;
+    static QBrush serverBgBrush_;
+    static QBrush buttonBgBrush_;
+    static QBrush buttonBgHoverBrush_;
+    static QPen   buttonHoverPen_;
+    static QBrush buttonBgRefreshBrush_;
+    static QPen   buttonRefreshPen_;
+    static QBrush periodBgBrush_;
+    static QBrush progBrush_;
+    static QBrush progBgBrush_;
+    static QBrush lastBgBrush_;
+    static QPen   serverTextPen_;
+    static QPen   periodTextPen_;
+    static QPen   driftTextPen_;
+    static QPen   lastTextPen_;
+    static QPen   disabledTextPen_;
+
+    QRect buttonRect_;
+    int buttonRadius2_;
+    QString periodText_;
+    QString driftText_;
+    int periodTextWidth_;
+    int periodTextWidthMin_;
+    QString periodDummyText_;
+    QString periodDummyFullText_;
+    int lastTextWidth_;
+    QRect serverRect_;
+    QRect periodRect_;
+    QRect progRect_;
+    QRect lastRect_;
+    Component currentComponent_;
+    int progRectHeight_;
+    int serverRectHeight_;
+    int serverYPadding_;
+
+    PropertyMapper* prop_;
+
+    Mode mode_;
+    int  noBlinkLimit_;
+    bool hasInfo_;
+    bool inRefresh_;
+    bool userInitiatedRefresh_;
+    bool showLastAutoRefresh_;
+    QString lastRefresh_;
+    QString nextRefresh_;
+    int total_;
+    int period_;
+    int toNext_;
+    int drift_;
+    bool needBorder_;
+
+};
+
+class ServerComActivityLine : public QWidget
+
+{
+//Q_OBJECT
+
+public:
+    explicit ServerComActivityLine(QWidget* parent=0);
+
+    void setServer(ServerHandler* server);
+
+protected:
+    void paintEvent(QPaintEvent*);
+
+    QFont font_;
+    QFontMetrics fm_;
+    ServerHandler* server_;
+    QPixmap pix_;
+    QTimer *timer_;
+};
+
+#if 0
+class ServerRefreshInfoWidget : public QWidget
+{
+public:
+    explicit ServerRefreshInfoWidget(QAction* refreshAction,QWidget *parent=0);
+
+    void setServer(ServerHandler* server);
+
+protected:
+    QAction* refreshAction_;
+    ServerComLineDisplay* infoW_;
+};
+#endif
+
+
+#endif // SERVERCOMLINE_HPP
diff --git a/Viewer/src/TriggerView.hpp b/Viewer/src/ServerComObserver.hpp
similarity index 51%
rename from Viewer/src/TriggerView.hpp
rename to Viewer/src/ServerComObserver.hpp
index ae6819c..fba1bac 100644
--- a/Viewer/src/TriggerView.hpp
+++ b/Viewer/src/ServerComObserver.hpp
@@ -5,40 +5,25 @@
 // In applying this licence, ECMWF does not 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 TRIGGERVIEW_HPP_
-#define TRIGGERVIEW_HPP_
+#ifndef SERVERCOMOBSERVER_HPP
+#define SERVERCOMOBSERVER_HPP
 
-#include <QGraphicsItem>
-#include <QGraphicsScene>
-#include <QGraphicsView>
+class ServerHandler;
 
-#include "VInfo.hpp"
-
-class NodeItem : public QGraphicsItem
+class ServerComObserver
 {
 public:
-	NodeItem();
-
-	QRectF boundingRect() const;
-	void paint(QPainter*, const QStyleOptionGraphicsItem *,QWidget*) {};
+    ServerComObserver() {}
+    virtual ~ServerComObserver() {}
+
+    virtual void notifyRefreshTimerStarted(ServerHandler* server) {}
+    virtual void notifyRefreshTimerStopped(ServerHandler* server) {}
+    virtual void notifyRefreshTimerChanged(ServerHandler* server) {}
+    virtual void notifyRefreshScheduled(ServerHandler* server) {}
+    virtual void notifyRefreshFinished(ServerHandler* server) {}
 };
 
+#endif // SERVERCOMOBSERVER_HPP
 
-class TriggerScene : public QGraphicsScene
-{
-public:
-	explicit TriggerScene(QWidget *parent=0);
-
-	void reset(VInfo_ptr info);
-};
-
-class TriggerView : public QGraphicsView
-{
-public:
-	explicit TriggerView(QWidget *parent=0);
-};
-
-#endif
diff --git a/Viewer/src/ServerComQueue.cpp b/Viewer/src/ServerComQueue.cpp
index b73fcba..38bf588 100644
--- a/Viewer/src/ServerComQueue.cpp
+++ b/Viewer/src/ServerComQueue.cpp
@@ -31,8 +31,11 @@ ServerComQueue::ServerComQueue(ServerHandler *server,ClientInvoker *client) :
 	client_(client),
     comThread_(0),
 	timeout_(5),
-    taskTimeout_(500),
-	state_(NoState), //the queue is enabled but not running
+    ctStartTimeout_(1000),
+    ctStartWaitTimeout_(500), //wait() is a blocking call, so it should be short
+    startTimeoutTryCnt_(0),
+    ctMaxStartTimeoutTryCnt_(4),
+    state_(NoState), //the queue is enabled but not running
     taskStarted_(false),
     taskIsBeingFinished_(false),
 	taskIsBeingFailed_(false)
@@ -45,23 +48,6 @@ ServerComQueue::ServerComQueue(ServerHandler *server,ClientInvoker *client) :
 
 
     createThread();
-
-#if 0
-    //When the ServerComThread starts it emits a signal that
-    //is connected to the queue.
-    connect(comThread_, SIGNAL(started()),
-            this, SLOT(slotTaskStarted()));
-
-    //When the ServerComThread finishes it emits a signal that
-	//is connected to the queue.
-	connect(comThread_, SIGNAL(finished()),
-			this, SLOT(slotTaskFinished()));
-
-	//When there is an error in ServerComThread it emits the
-	//failed() signal that is connected to the queue.
-	connect(comThread_, SIGNAL(failed(std::string)),
-			this, SLOT(slotTaskFailed(std::string)));
-#endif
 }
 
 ServerComQueue::~ServerComQueue()
@@ -85,7 +71,7 @@ ServerComQueue::~ServerComQueue()
 	VTask_ptr task=VTask::create(VTask::LogOutTask);
 	comThread_->task(task);
 
-	//Wait unit the logout finishes
+    //Wait until the logout finishes
 	comThread_->wait();
 
 	delete comThread_;
@@ -146,7 +132,7 @@ void ServerComQueue::disable()
 	tasks_.clear();
 
 	//Stop the timer
-	timer_->stop();
+    stopTimer();
 
 	//If the comthread is running we need to wait
 	//until it finishes its task.
@@ -169,7 +155,7 @@ bool ServerComQueue::prepareReset()
 		return false;
 
 	//Stop the timer
-	timer_->stop();
+    stopTimer();
 
 	//Remove all tasks
 	tasks_.clear();
@@ -232,6 +218,7 @@ void ServerComQueue::start()
         //assert(taskIsBeingFailed_==false);
         //assert(!current_);
 
+        startTimeoutTryCnt_=0;
         taskStarted_=false;
 
 		//If the comthread is running we need to wait
@@ -258,8 +245,8 @@ void ServerComQueue::suspend(bool wait)
 	   state_ != SuspendedState)
 	{
 		state_=SuspendedState;
-		timer_->stop();
-		if(wait)
+        stopTimer();
+        if(wait)
 		{
 			comThread_->wait();
 		}
@@ -270,6 +257,12 @@ void ServerComQueue::suspend(bool wait)
 	}
 }
 
+void ServerComQueue::stopTimer()
+{
+    timer_->stop();
+    startTimeoutTryCnt_=0;
+}
+
 bool ServerComQueue::hasTask(VTask::Type t) const
 {
 	for(std::deque<VTask_ptr>::const_iterator it=tasks_.begin(); it != tasks_.end(); ++it)
@@ -323,6 +316,7 @@ void ServerComQueue::addNewsTask()
 
 	VTask_ptr task=VTask::create(VTask::NewsTask);
 	addTask(task);
+    server_->refreshScheduled();
 }
 
 void ServerComQueue::addSyncTask()
@@ -364,19 +358,16 @@ void ServerComQueue::addSuiteAutoRegisterTask()
 void ServerComQueue::startCurrentTask()
 {
     taskStarted_=false;
-    taskTime_.start();
+    ctStartTime_.start();
     comThread_->task(current_);
 }
 
 void ServerComQueue::slotRun()
 {
-#ifdef _UI_SERVERCOMQUEUE_DEBUG
-    UiLog(server_).dbg() << "ComQueue::slotRun -->";
-#endif
-
 	if(state_ == DisabledState ||state_ == SuspendedState )
     {
-#ifdef _UI_SERVERCOMQUEUE_DEBUG
+#ifdef _UI_SERVERCOMQUEUE_DEBUG       
+        UI_FUNCTION_LOG_S(server_);
         UiLog(server_).dbg() << " queue is either disabled or suspended";
 #endif
         return;
@@ -384,67 +375,92 @@ void ServerComQueue::slotRun()
 
 	if(taskIsBeingFinished_ || taskIsBeingFailed_)
     {
-#ifdef _UI_SERVERCOMQUEUE_DEBUG
+#ifdef _UI_SERVERCOMQUEUE_DEBUG        
+        UI_FUNCTION_LOG_S(server_);
         UiLog(server_).dbg() << " task is either being finished or failed";
 #endif
         return;
     }
 
-#ifdef _UI_SERVERCOMQUEUE_DEBUG
-    UiLog(server_).dbg() << " number of tasks: "  << tasks_.size();
-    for(std::deque<VTask_ptr>::const_iterator it=tasks_.begin(); it != tasks_.end(); it++)
-    {
-        UiLog(server_).dbg() << "  task: " << (*it)->typeString();
-    }
-#endif
-
     if(tasks_.empty() && !current_)
 	{
-#ifdef _UI_SERVERCOMQUEUE_DEBUG
+#ifdef _UI_SERVERCOMQUEUE_DEBUG        
+        UI_FUNCTION_LOG_S(server_);
         UiLog(server_).dbg() << " there are no tasks! Stop timer!";
 #endif
         timer_->stop();
 		return;
 	}
 
+#if 0
+#ifdef _UI_SERVERCOMQUEUE_DEBUG
+    if(tasks_.size() > 0)
+    {
+        UI_FUNCTION_LOG_S(server_);
+        UiLog(server_).dbg() << " number of tasks: "  << tasks_.size();
+        for(std::deque<VTask_ptr>::const_iterator it=tasks_.begin(); it != tasks_.end(); it++)
+        {
+            UiLog(server_).dbg() << "  task: " << (*it)->typeString();
+        }
+    }
+#endif
+#endif
+
     //If a task was sent to the thread but the queue did not get the
     //notification about the thread's start there is a PROBLEM!
     //Note: when the thread starts it emits a signal to the queue
     //and the queue sets taskStarted_ to true. Since this is a queued communication
     //there can be a time lag between the two events. We set a timeout for it!
     //If we pass the timeout we stop the thread and try to resend the task!
-    if(current_ && !taskStarted_ && taskTime_.elapsed() > taskTimeout_)
-    {
-        bool rerun=false;
-        bool r=comThread_->isRunning();
-
-        //So if we are here:
-        //-the thread did not emit a notification about its start
-        //-the elapsed time since we sent the task to the thread past the timeout.
-
-        //Problem 1:
-        //-the thread is running
-        if(r)
+    if(current_ && !taskStarted_ && ctStartTime_.elapsed() > ctStartTimeout_)
+    {      
+        UI_FUNCTION_LOG_S(server_);
+        if(startTimeoutTryCnt_ < ctMaxStartTimeoutTryCnt_)
         {
-            UiLog(server_).warn() << " It seems that the ServerCom thread started but it is in a bad state. Try to run task again.";
-            rerun=true;
-            //assert(false);
-        }
+            UiLog(server_).warn() << " ServerCom thread does not seem to have started within the allocated timeout. \
+                          startTimeoutTryCnt_=" << startTimeoutTryCnt_;
 
-        //Problem 2:
-        //-the thread is not running
-        else if(!r)
-        {
-            UiLog(server_).warn() << " It seems that the ServerCom thread could not start. Try to run task again.";
-            rerun=true;
+            startTimeoutTryCnt_++;
         }
-
-        if(rerun)
+        else
         {
-            if(comThread_->wait(taskTimeout_) == false)
+            startTimeoutTryCnt_=0;
+
+            //So if we are here:
+            //-the thread did not emit a notification about its start
+            //-the elapsed time since we sent the task to the thread past the timeout.
+            //-since the timeout was passed slotRun() has been was called at least startTimeoutTryCnt_ times
+
+            bool running=comThread_->isRunning();
+
+            //Problem 1:
+            //-the thread is running
+            if(running)
             {
+                UiLog(server_).warn() << " It seems that the ServerCom thread started but it is in a bad state. Try to run task again.";
+            }
+
+            //Problem 2:
+            //-the thread is not running
+            else
+            {
+                UiLog(server_).warn() << " It seems that the ServerCom thread could not start. Try to run task again.";
+            }
+
+            if(comThread_->wait(ctStartWaitTimeout_) == false)
+            {              
+                UiLog(server_).warn() << "  Calling wait() on the ServerCom thread failed.";
+
+                //The thread started to run in the meantime. We check its status again at the next slotRun call.
+                if(!running && comThread_->isRunning())
+                {
+                    UiLog(server_).warn() << "  It seems that in the meantime the thread started to run.\
+                                   We will check its state again";
+                    return;
+                }
+
+                //Otherwise there is nothing to do!!
                 //We exit here because when we tried to call terminate() it just hung!!
-                UiLog(server_).err() << "  Calling wait() on the ServerCom thread failed.";
                 UI_ASSERT(0,"Cannot stop ServerCom thread, which is in a bad state");
                 exit(1);
 #if 0
@@ -464,6 +480,8 @@ void ServerComQueue::slotRun()
 #endif
             }
 
+            UiLog(server_).warn() << "  Calling wait() on the ServerCom thread succeeded.";
+
             Q_ASSERT(comThread_->isRunning() == false);
 
             if(current_->status() != VTask::CANCELLED &&
@@ -474,43 +492,18 @@ void ServerComQueue::slotRun()
             }
             else
             {
-    #ifdef _UI_SERVERCOMQUEUE_DEBUG
+#ifdef _UI_SERVERCOMQUEUE_DEBUG
                 UiLog(server_).dbg() << "  current_ aborted or cancelled. Reset current_ !";
-    #endif
+#endif
                 current_.reset();
             }
         }
     }
 
-
-#if 0
-    //If the thread could not start up for the current task.
-    if(current_ && !taskStarted_ && !comThread_->isRunning() &&
-       taskTime_.elapsed() > taskTimeout_)
-    {
-        UiLog(server_).dbg() << " It seems that the thread could not start. Try to run task again.";
-        comThread_->wait();
-
-        if(current_->status() != VTask::CANCELLED &&
-           current_->status() != VTask::ABORTED )
-        {
-            startCurrentTask();
-            return;
-        }
-        else
-        {
-#ifdef _UI_SERVERCOMQUEUE_DEBUG
-            UiLog(server_).dbg() << "  current_ aborted or cancelled. Reset current_ !";
-#endif
-            current_.reset();
-        }
-    }
-#endif
-
 	if(current_)
 	{
 #ifdef _UI_SERVERCOMQUEUE_DEBUG
-        UiLog(server_).dbg() << " still processing reply from previous task";
+        //UiLog(server_).dbg() << " still processing reply from previous task";
 #endif
         return;
 	}
@@ -518,7 +511,7 @@ void ServerComQueue::slotRun()
 	if(comThread_->isRunning())
 	{
 #ifdef _UI_SERVERCOMQUEUE_DEBUG
-        UiLog(server_).dbg() << " thread is active";
+        //UiLog(server_).dbg() << " thread is active";
 #endif
 		return;
 	}
@@ -541,8 +534,9 @@ void ServerComQueue::slotRun()
 		timer_->stop();
 		return;
 	}
-#ifdef _UI_SERVERCOMQUEUE_DEBUG
-     UiLog(server_).dbg() << " run task: " <<  current_->typeString();
+
+#ifdef _UI_SERVERCOMQUEUE_DEBUG  
+    UiLog(server_).dbg() << " run task: " <<  current_->typeString();
 #endif
 
     //Send it to the thread
@@ -562,6 +556,7 @@ void ServerComQueue::slotTaskFinished()
 {
     taskStarted_=false;
     taskIsBeingFinished_=true;
+    startTimeoutTryCnt_=0;
 
     UiLog(server_).dbg() << "ComQueue::slotTaskFinished -->";
 
@@ -593,6 +588,7 @@ void ServerComQueue::slotTaskFailed(std::string msg)
 {
     taskStarted_=false;
     taskIsBeingFailed_=true;
+    startTimeoutTryCnt_=0;
 
     UiLog(server_).dbg() << "ComQueue::slotTaskFailed -->";
 #ifdef _UI_SERVERCOMQUEUE_DEBUG
diff --git a/Viewer/src/ServerComQueue.hpp b/Viewer/src/ServerComQueue.hpp
index 1a77754..cdf4d58 100644
--- a/Viewer/src/ServerComQueue.hpp
+++ b/Viewer/src/ServerComQueue.hpp
@@ -62,6 +62,7 @@ protected Q_SLOTS:
 
 protected:
     void createThread();
+    void stopTimer();
     void startCurrentTask();
     void endReset();
 	bool hasTask(VTask::Type t) const;
@@ -72,11 +73,14 @@ protected:
 	ServerComThread *comThread_;
 	QTimer* timer_;
     int timeout_;
-    QTime taskTime_;
-    int taskTimeout_;
+    QTime ctStartTime_;
+    int ctStartTimeout_;
+    int ctStartWaitTimeout_;
+    int startTimeoutTryCnt_;
+    int ctMaxStartTimeoutTryCnt_;
 	std::deque<VTask_ptr> tasks_;
 	VTask_ptr current_;
-	State state_;
+	State state_;  
     bool taskStarted_;
     bool taskIsBeingFinished_;
 	bool taskIsBeingFailed_;
diff --git a/Viewer/src/ServerComThread.cpp b/Viewer/src/ServerComThread.cpp
index 4ca07e5..19078dd 100644
--- a/Viewer/src/ServerComThread.cpp
+++ b/Viewer/src/ServerComThread.cpp
@@ -24,20 +24,20 @@
 #define _UI_SERVERCOMTHREAD_DEBUG
 
 ServerComThread::ServerComThread(ServerHandler *server, ClientInvoker *ci) :
-		server_(server),
-		ci_(ci),
-		taskType_(VTask::NoTask),
-		rescanNeed_(false),
-		hasSuiteFilter_(false),
-		autoAddNewSuites_(false),
-		maxLineNum_(-1)
+        server_(server),
+        ci_(ci),
+        taskType_(VTask::NoTask),
+        rescanNeed_(false),
+        hasSuiteFilter_(false),
+        autoAddNewSuites_(false),
+        maxLineNum_(-1)
 {
     assert(server_);
 }
 
 ServerComThread::~ServerComThread()
 {
-	detach();
+    detach();
 }
 
 void ServerComThread::task(VTask_ptr task)
@@ -45,162 +45,164 @@ void ServerComThread::task(VTask_ptr task)
     //do not execute thread if already running
 
     if(isRunning())
-	{
+    {
         UiLog(serverName_).err() << "ComThread::task - thread already running, will not execute command";
-	}
-	else
-	{
-		//if(!server_ && server)
-		//	initObserver(server);
-
-		//We set the parameters needed to run the task. These members are not protected by
-		//a mutex, because apart from this function only run() can access them!!
+    }
+    else
+    {
+        //if(!server_ && server)
+        //    initObserver(server);
+
+        //We set the parameters needed to run the task. These members are not protected by
+        //a mutex, because apart from this function only run() can access them!!
         serverName_=server_->longName();
         command_=task->command();
-		params_=task->params();
-		contents_=task->contents();
-		vars_=task->vars();
-		nodePath_.clear();
-		taskType_=task->type();
-		nodePath_=task->targetPath();
+        params_=task->params();
+        contents_=task->contents();
+        vars_=task->vars();
+        nodePath_.clear();
+        taskType_=task->type();
+        nodePath_=task->targetPath();
         zombie_=task->zombie();
 
-		//Suite filter
-		hasSuiteFilter_=server_->suiteFilter()->isEnabled();
-		autoAddNewSuites_=server_->suiteFilter()->autoAddNewSuites();
+        //Suite filter
+        hasSuiteFilter_=server_->suiteFilter()->isEnabled();
+        autoAddNewSuites_=server_->suiteFilter()->autoAddNewSuites();
         if(hasSuiteFilter_)
             filteredSuites_=server_->suiteFilter()->filter();
         else
             filteredSuites_.clear();
 
-		maxLineNum_=server_->conf()->intValue(VServerSettings::MaxOutputFileLines);
+        maxLineNum_=server_->conf()->intValue(VServerSettings::MaxOutputFileLines);
 
-		//Start the thread execution
-		start();
-	}
+        //Start the thread execution
+        start();
+    }
 }
 
 void ServerComThread::run()
-{	
+{    
     UiLog(serverName_).dbg() << "ComThread::run --> path="  <<  nodePath_;
 
     //Init flags
     rescanNeed_=false;
+    bool isMessage = false;
+    std::string errorString;
 
-	try
- 	{
-		switch (taskType_)
-		{
-			case VTask::CommandTask:
-			{
-				// call the client invoker with the saved command
+    try
+    {
+        switch (taskType_)
+        {
+            case VTask::CommandTask:
+            {
+                // call the client invoker with the saved command
                 UiLog(serverName_).dbg() << " COMMAND";
-				ArgvCreator argvCreator(command_);
+                ArgvCreator argvCreator(command_);
 #ifdef _UI_SERVERCOMTHREAD_DEBUG
                 UiLog(serverName_).dbg() << " args="  << argvCreator.toString();
 #endif
-				ci_->invoke(argvCreator.argc(), argvCreator.argv());
-
-				/*ci_->news_local();
-				switch (ci_->server_reply().get_news())
-				{
-					case ServerReply::NO_NEWS:
-					case ServerReply::NEWS:
-						ci_->sync_local();
-						break;
-					case ServerReply::DO_FULL_SYNC:
-
-				break;
-				}*/
-				break;
-			}
-
-			case VTask::NewsTask:
-			{
+                ci_->invoke(argvCreator.argc(), argvCreator.argv());
+
+                /*ci_->news_local();
+                switch (ci_->server_reply().get_news())
+                {
+                    case ServerReply::NO_NEWS:
+                    case ServerReply::NEWS:
+                        ci_->sync_local();
+                        break;
+                    case ServerReply::DO_FULL_SYNC:
+
+                break;
+                }*/
+                break;
+            }
+
+            case VTask::NewsTask:
+            {
                 UiLog(serverName_).dbg() << " NEWS";
-				ci_->news_local(); // call the server
-				break;
-			}
+                ci_->news_local(); // call the server
+                break;
+            }
 
-			case VTask::SyncTask:
-			{
+            case VTask::SyncTask:
+            {
                 UiLog(serverName_).dbg() << " SYNC";
-				sync_local();
-				break;
-			}
+                sync_local();
+                break;
+            }
 
-			//This is called during reset
-			case VTask::ResetTask:
-			{
+            //This is called during reset
+            case VTask::ResetTask:
+            {
                 UiLog(serverName_).dbg() << " SYNC";
-				reset();
-				break;
-			}
-
-			case VTask::JobTask:
-			case VTask::ManualTask:
-			case VTask::ScriptTask:
-			case VTask::OutputTask:
-			{
+                reset();
+                break;
+            }
+
+            case VTask::JobTask:
+            case VTask::ManualTask:
+            case VTask::ScriptTask:
+            case VTask::OutputTask:
+            {
                 UiLog(serverName_).dbg() << " FILE" << " " << params_["clientPar"];
-				if(maxLineNum_ < 0)
-					ci_->file(nodePath_,params_["clientPar"]);
-				else
-					ci_->file(nodePath_,params_["clientPar"],boost::lexical_cast<std::string>(maxLineNum_));
+                if(maxLineNum_ < 0)
+                    ci_->file(nodePath_,params_["clientPar"]);
+                else
+                    ci_->file(nodePath_,params_["clientPar"],boost::lexical_cast<std::string>(maxLineNum_));
 
-				break;
-			}
+                break;
+            }
 
-			case VTask::MessageTask:
-			{
+            case VTask::MessageTask:
+            {
                 UiLog(serverName_).dbg() << " EDIT HISTORY";
-				ci_->edit_history(nodePath_);
-				break;
-			}
+                ci_->edit_history(nodePath_);
+                break;
+            }
 
-			case VTask::StatsTask:
-			{
+            case VTask::StatsTask:
+            {
                 UiLog(serverName_).dbg() << " STATS";
-				ci_->stats();
-				break;
-			}
+                ci_->stats();
+                break;
+            }
 
-			case VTask::HistoryTask:
-			{
+            case VTask::HistoryTask:
+            {
                 UiLog(serverName_).dbg() << " SERVER LOG";
-				ci_->getLog(100);
-				break;
-			}
+                ci_->getLog(100);
+                break;
+            }
 
-			case VTask::ScriptPreprocTask:
+            case VTask::ScriptPreprocTask:
                 UiLog(serverName_).dbg() << " SCRIP PREPROCESS";
-				ci_->edit_script_preprocess(nodePath_);
-				break;
+                ci_->edit_script_preprocess(nodePath_);
+                break;
 
-			case VTask::ScriptEditTask:
+            case VTask::ScriptEditTask:
                 UiLog(serverName_).dbg() << " SCRIP EDIT";
-				ci_->edit_script_edit(nodePath_);
-				break;
+                ci_->edit_script_edit(nodePath_);
+                break;
 
-			case VTask::ScriptSubmitTask:
+            case VTask::ScriptSubmitTask:
                 UiLog(serverName_).dbg() << " SCRIP SUBMIT";
-				ci_->edit_script_submit(nodePath_, vars_, contents_,
-						(params_["alias"]=="1")?true:false,
-						(params_["run"] == "1")?true:false);
-				break;
+                ci_->edit_script_submit(nodePath_, vars_, contents_,
+                        (params_["alias"]=="1")?true:false,
+                        (params_["run"] == "1")?true:false);
+                break;
 
-			case VTask::SuiteListTask:
+            case VTask::SuiteListTask:
                 UiLog(serverName_).dbg() << " SUITES";
-				ci_->suites();
-				break;
+                ci_->suites();
+                break;
 
-			case VTask::SuiteAutoRegisterTask:
+            case VTask::SuiteAutoRegisterTask:
                 UiLog(serverName_).dbg() << " SUITE AUTO REGISTER";
-				if(hasSuiteFilter_)
-				{
-					ci_->ch1_auto_add(autoAddNewSuites_);
-				}
-				break;
+                if(hasSuiteFilter_)
+                {
+                    ci_->ch1_auto_add(autoAddNewSuites_);
+                }
+                break;
 
             case VTask::ZombieCommandTask:
             {
@@ -222,112 +224,124 @@ void ServerComThread::run()
                 break;
             }
 
-			case VTask::ZombieListTask:
+            case VTask::ZombieListTask:
                 UiLog(serverName_).dbg() << " ZOMBIES";
-				ci_->zombieGet();
-				break;
+                ci_->zombieGet();
+                break;
 
-			case VTask::LogOutTask:
+            case VTask::LogOutTask:
                 UiLog(serverName_).dbg() << " LOGOUT";
                 detach();
                 if(ci_->client_handle() > 0)
-				{
-					ci_->ch1_drop();
-				}
-				break;
-			default:
-				break;
-		}
-	}
-
-	catch(std::exception& e)
-	{
-		// note that we need to emit a signal rather than directly call a message function
-		// because we can't call Qt widgets from a worker thread
-
-		std::string errorString = e.what();
+                {
+                    ci_->ch1_drop();
+                }
+                break;
+            default:
+                break;
+        }
+    }
+    catch(std::exception& e)
+    {
+        isMessage = true;
+        errorString = e.what();
+    }
+
+    // we can get an error string in one of two ways - either an exception is raised, or
+    // the get_string() of the server reply is non-empty.
+    if (!isMessage && (taskType_ == VTask::CommandTask) && !(ci_->server_reply().get_string().empty()))
+    {
+        isMessage = true;
+        errorString = ci_->server_reply().get_string();
+    }
+
+    if (isMessage)
+    {
+        // note that we need to emit a signal rather than directly call a message function
+        // because we can't call Qt widgets from a worker thread
+
         UiLog(serverName_).dbg() << " thread failed: " <<  errorString;
         Q_EMIT failed(errorString);
 
         //Reset flags
         rescanNeed_=false;
 
-		//This will stop the thread.
-		return;
-	}
+        //This will stop the thread.
+        return;
+    }
 
     //Reset flags
     rescanNeed_=false;
 
-	//Can we use it? We are in the thread!!!
-	//UserMessage::message(UserMessage::DBG, false, std::string("  ServerComThread::run finished"));
+    //Can we use it? We are in the thread!!!
+    //UserMessage::message(UserMessage::DBG, false, std::string("  ServerComThread::run finished"));
 }
 
 
 void ServerComThread::sync_local()
 {
-	//For this part we need to lock the mutex on defs
-	{
-		ServerDefsAccess defsAccess(server_);
+    //For this part we need to lock the mutex on defs
+    {
+        ServerDefsAccess defsAccess(server_);
 
         UiLog(serverName_).dbg() << "ComThread::sync_local --> sync begin";
-		ci_->sync_local();
+        ci_->sync_local();
         UiLog(serverName_).dbg() << " sync end";
 
-		//If a rescan or fullscan is needed we have either added/remove nodes or deleted the defs.
-		//So there were significant changes.
+        //If a rescan or fullscan is needed we have either added/remove nodes or deleted the defs.
+        //So there were significant changes.
 
-		//We detach the nodes currently available in defs, then we attach them again. We can still have nodes
-		//that were removed from the defs but are still attached. These will be detached when in ServerHandler we
-		//clear the tree. This tree contains shared pointers to the nodes, so when the tree is cleared
-		//the shared pointer are reset, the node descturctor is called and finally update_delete is called and
-		//we can detach the node.
+        //We detach the nodes currently available in defs, then we attach them again. We can still have nodes
+        //that were removed from the defs but are still attached. These will be detached when in ServerHandler we
+        //clear the tree. This tree contains shared pointers to the nodes, so when the tree is cleared
+        //the shared pointer are reset, the node descturctor is called and finally update_delete is called and
+        //we can detach the node.
 
-		if(rescanNeed_ || ci_->server_reply().full_sync())
-		{
+        if(rescanNeed_ || ci_->server_reply().full_sync())
+        {
             UiLog(serverName_).dbg() << " rescan needed!";
-			detach(defsAccess.defs());
-			attach(defsAccess.defs());
-		}
-	}
+            detach(defsAccess.defs());
+            attach(defsAccess.defs());
+        }
+    }
 }
 
 void ServerComThread::reset()
 {
     UiLog(serverName_).dbg() << "ComThread::reset -->";
 
-	//Lock the mutex on defs
-	ServerDefsAccess defsAccess(server_);
+    //Lock the mutex on defs
+    ServerDefsAccess defsAccess(server_);
 
     //Detach the defs and the nodes from the observer
     detach(defsAccess.defs());
 
-	//If we have already set a handle we
-	//need to drop it.
-	if(ci_->client_handle() > 0)
-	{
-		try
-		{
-			ci_->ch1_drop();
-		}
-		catch (std::exception &e)
-		{
+    //If we have already set a handle we
+    //need to drop it.
+    if(ci_->client_handle() > 0)
+    {
+        try
+        {
+            ci_->ch1_drop();
+        }
+        catch (std::exception &e)
+        {
             UiLog(serverName_).warn() << " cannot drop handle: " << e.what();
-		}
-	}
+        }
+    }
 
-	if(hasSuiteFilter_)
-	{
-		//reset client handle + defs
-		ci_->reset();
+    if(hasSuiteFilter_)
+    {
+        //reset client handle + defs
+        ci_->reset();
 
-		if(!filteredSuites_.empty())
-		{
+        if(!filteredSuites_.empty())
+        {
             UiLog(serverName_).dbg() << " register suites";
 
-			//This will add a new handle to the client
-			ci_->ch_register(autoAddNewSuites_, filteredSuites_);
-		}
+            //This will add a new handle to the client
+            ci_->ch_register(autoAddNewSuites_, filteredSuites_);
+        }
         //If the suite filter is empty
         else
         {
@@ -340,19 +354,19 @@ void ServerComThread::reset()
             fsl.push_back(SuiteFilter::dummySuite());
             ci_->ch_register(autoAddNewSuites_, fsl);
         }
-	}
-	else
-	{
-		// reset client handle + defs
-		ci_->reset();
-	}
+    }
+    else
+    {
+        // reset client handle + defs
+        ci_->reset();
+    }
 
     UiLog(serverName_).dbg() << " sync begin";
-	ci_->sync_local();
+    ci_->sync_local();
     UiLog(serverName_).dbg() << " sync end";
 
     //Attach the nodes to the observer
-	attach(defsAccess.defs());
+    attach(defsAccess.defs());
 
     UiLog(serverName_).dbg() << "<-- ComThread::reset";
 }
@@ -360,8 +374,8 @@ void ServerComThread::reset()
 //This is an observer notification method!!
 void ServerComThread::update(const Node* node, const std::vector<ecf::Aspect::Type>& types)
 {
-	//This function can only be called during a SYNC_LOCAl task!!!!
-	assert(taskType_ == VTask::SyncTask);
+    //This function can only be called during a SYNC_LOCAl task!!!!
+    assert(taskType_ == VTask::SyncTask);
 
     std::vector<ecf::Aspect::Type> typesCopy=types;
 
@@ -371,37 +385,37 @@ void ServerComThread::update(const Node* node, const std::vector<ecf::Aspect::Ty
     UiLog(serverName_).dbg() << " aspects: " << ss.str();
 
     //If a node was already requested to be added/deleted in the thread we do not go further. At the end of the sync
-	//we will regenerate everything (the tree as well in ServerHandle).
+    //we will regenerate everything (the tree as well in ServerHandle).
     if(rescanNeed_)
-	{
+    {
         UiLog(serverName_).dbg() << " rescanNeed already set";
-		return;
-	}
+        return;
+    }
 
     //This is a radical change
     if((std::find(types.begin(),types.end(),ecf::Aspect::ADD_REMOVE_NODE) != types.end()) ||
        (std::find(types.begin(),types.end(),ecf::Aspect::ORDER)           != types.end()))
     {
         UiLog(serverName_).dbg() << " emit rescanNeed()";
-		rescanNeed_=true;
+        rescanNeed_=true;
 
-		//We notify ServerHandler about the radical changes. When ServerHandler receives this signal
-		//it will clear its tree, which stores shared pointers to the nodes (node_ptr). If these pointers are
-		//reset update_delete() might be called, so it should not write any shared variables!
-		Q_EMIT rescanNeed();
+        //We notify ServerHandler about the radical changes. When ServerHandler receives this signal
+        //it will clear its tree, which stores shared pointers to the nodes (node_ptr). If these pointers are
+        //reset update_delete() might be called, so it should not write any shared variables!
+        Q_EMIT rescanNeed();
 
-		return;
-	}
+        return;
+    }
 
     //This will notify SeverHandler
     UiLog(serverName_).dbg() << " emit nodeChanged()";
-	Q_EMIT nodeChanged(node,types);
+    Q_EMIT nodeChanged(node,types);
 }
 
 
 void ServerComThread::update(const Defs* dc, const std::vector<ecf::Aspect::Type>& types)
 {
-	std::vector<ecf::Aspect::Type> typesCopy=types;
+    std::vector<ecf::Aspect::Type> typesCopy=types;
 
     UiLog(serverName_).dbg() << "ComThread::update --> defs";
     std::stringstream ss;
@@ -411,10 +425,10 @@ void ServerComThread::update(const Defs* dc, const std::vector<ecf::Aspect::Type
     //If anything was requested to be deleted in the thread we do not go further
     //because it will trigger a full rescan in ServerHandler!
     if(rescanNeed_)
-	{
+    {
         UiLog(serverName_).dbg() << " rescanNeed already set";
-	    return;
-	}
+        return;
+    }
 
     //This is a radical change
     if(std::find(types.begin(),types.end(),ecf::Aspect::ORDER) != types.end())
@@ -432,13 +446,13 @@ void ServerComThread::update(const Defs* dc, const std::vector<ecf::Aspect::Type
 
     //This will notify SeverHandler
     UiLog(serverName_).dbg() << " emit defsChanged()";
-	Q_EMIT defsChanged(typesCopy);
+    Q_EMIT defsChanged(typesCopy);
 }
 
 void ServerComThread::update_delete(const Node* nc)
 {
-	Node *n=const_cast<Node*>(nc);
-	n->detach(this);
+    Node *n=const_cast<Node*>(nc);
+    n->detach(this);
 }
 
 //This only be called when ComThread is running or from the ComThread desctructor. So it is safe to set
@@ -453,65 +467,65 @@ void ServerComThread::update_delete(const Defs* dc)
     //If we are in  a SYNC_LOCAl task!!!!
     if(taskType_ == VTask::SyncTask)
     {
-    	//We notify ServerHandler about the radical changes. When ServerHandler receives this signal
-    	//it will clear its tree, which stores shared pointers to the nodes (node_ptr). If these pointers are
-    	//reset update_delete() might be called, so it should not write any shared variables!
-    	Q_EMIT rescanNeed();
+        //We notify ServerHandler about the radical changes. When ServerHandler receives this signal
+        //it will clear its tree, which stores shared pointers to the nodes (node_ptr). If these pointers are
+        //reset update_delete() might be called, so it should not write any shared variables!
+        Q_EMIT rescanNeed();
 
-    	rescanNeed_=true;
+        rescanNeed_=true;
     }
 }
 
 //Attach each node and the defs to the observer
 void ServerComThread::attach()
 {
-	ServerDefsAccess defsAccess(server_);  // will reliquish its resources on destruction
-	defs_ptr d = defsAccess.defs();
-	if(d == NULL)
-		return;
+    ServerDefsAccess defsAccess(server_);  // will reliquish its resources on destruction
+    defs_ptr d = defsAccess.defs();
+    if(d == NULL)
+        return;
 
-	attach(d);
+    attach(d);
 }
 
 //Attach  each node and the defs to the observer. The access to
 //the defs is safe so we do not need to set a mutex on it.
 void ServerComThread::attach(defs_ptr d)
 {
-	if(d == NULL)
-		return;
+    if(d == NULL)
+        return;
 
-	d->attach(this);
+    d->attach(this);
 
-	const std::vector<suite_ptr> &suites = d->suiteVec();
-	for(unsigned int i=0; i < suites.size();i++)
-	{
-		attach(suites.at(i).get());
-	}
+    const std::vector<suite_ptr> &suites = d->suiteVec();
+    for(unsigned int i=0; i < suites.size();i++)
+    {
+        attach(suites.at(i).get());
+    }
 }
 
 //Attach a node to the observer
 void ServerComThread::attach(Node *node)
 {
-	std::vector<node_ptr> nodes;
-	node->immediateChildren(nodes);
+    std::vector<node_ptr> nodes;
+    node->immediateChildren(nodes);
 
-	node->attach(this);
+    node->attach(this);
 
-	for(std::vector<node_ptr>::const_iterator it=nodes.begin(); it != nodes.end(); ++it)
-	{
-		attach((*it).get());
-	}
+    for(std::vector<node_ptr>::const_iterator it=nodes.begin(); it != nodes.end(); ++it)
+    {
+        attach((*it).get());
+    }
 }
 
 //Detach each node and the defs from the observer
 void ServerComThread::detach()
 {
-	ServerDefsAccess defsAccess(server_);  // will reliquish its resources on destruction
-	defs_ptr d = defsAccess.defs();
-	if(d == NULL)
-		return;
+    ServerDefsAccess defsAccess(server_);  // will reliquish its resources on destruction
+    defs_ptr d = defsAccess.defs();
+    if(d == NULL)
+        return;
 
-	detach(d);
+    detach(d);
 }
 
 
@@ -519,30 +533,30 @@ void ServerComThread::detach()
 //the defs is safe so we do not need to set a mutex on it.
 void ServerComThread::detach(defs_ptr d)
 {
-	if(d == NULL)
-		return;
+    if(d == NULL)
+        return;
 
-	d->detach(this);
+    d->detach(this);
 
-	const std::vector<suite_ptr> &suites = d->suiteVec();
-	for(unsigned int i=0; i < suites.size();i++)
-	{
-		detach(suites.at(i).get());
-	}
+    const std::vector<suite_ptr> &suites = d->suiteVec();
+    for(unsigned int i=0; i < suites.size();i++)
+    {
+        detach(suites.at(i).get());
+    }
 }
 
 //Detach a node from the observer
 void ServerComThread::detach(Node *node)
 {
-	std::vector<node_ptr> nodes;
-	node->immediateChildren(nodes);
+    std::vector<node_ptr> nodes;
+    node->immediateChildren(nodes);
 
-	node->detach(this);
+    node->detach(this);
 
-	for(std::vector<node_ptr>::const_iterator it=nodes.begin(); it != nodes.end(); ++it)
-	{
-		detach((*it).get());
-	}
+    for(std::vector<node_ptr>::const_iterator it=nodes.begin(); it != nodes.end(); ++it)
+    {
+        detach((*it).get());
+    }
 }
 
 void ServerComThread::aspectToStr(std::stringstream& ss,const std::vector<ecf::Aspect::Type>& t) const
diff --git a/Viewer/src/ServerHandler.cpp b/Viewer/src/ServerHandler.cpp
index 02a7fb3..d1086d4 100644
--- a/Viewer/src/ServerHandler.cpp
+++ b/Viewer/src/ServerHandler.cpp
@@ -24,6 +24,7 @@
 #include "ServerComQueue.hpp"
 #include "ServerDefsAccess.hpp"
 #include "ServerObserver.hpp"
+#include "ServerComObserver.hpp"
 #include "SuiteFilter.hpp"
 #include "UiLog.hpp"
 #include "UpdateTimer.hpp"
@@ -32,6 +33,7 @@
 #include "VSettings.hpp"
 #include "VTaskObserver.hpp"
 
+#include <QDateTime>
 #include <QDebug>
 #include <QMessageBox>
 #include <QMetaType>
@@ -48,6 +50,7 @@ std::vector<ServerHandler*> ServerHandler::servers_;
 std::string ServerHandler::localHostName_;
 
 //#define __UI_SERVEROBSERVER_DEBUG
+//#define __UI_SERVERCOMOBSERVER_DEBUG
 #define __UI_SERVERUPDATE_DEBUG
 
 ServerHandler::ServerHandler(const std::string& name,const std::string& host, const std::string& port) :
@@ -57,12 +60,12 @@ ServerHandler::ServerHandler(const std::string& name,const std::string& host, co
    client_(0),
    updating_(false),
    communicating_(false),
+   suiteFilter_(new SuiteFilter()),
    comQueue_(0),
    activity_(NoActivity),
    connectState_(new ConnectState()),
-   suiteFilter_(new SuiteFilter()),
-   conf_(0),
-   prevServerState_(SState::RUNNING)
+   prevServerState_(SState::RUNNING),
+   conf_(0)
 {
 	if(localHostName_.empty())
 	{
@@ -163,6 +166,27 @@ ServerHandler::~ServerHandler()
 	delete conf_;
 }
 
+//-----------------------------------------------
+// Refresh/update
+//-----------------------------------------------
+
+bool ServerHandler::updateInfo(int& basePeriod,int& currentPeriod,int &drift,int& toNext)
+{
+    if(!refreshTimer_->isActive())
+        return false;
+
+    toNext=secsTillNextRefresh();
+    basePeriod=conf_->intValue(VServerSettings::UpdateRate);
+    currentPeriod=refreshTimer_->interval()/1000;
+    drift=-1;
+    if(conf_->boolValue(VServerSettings::AdaptiveUpdate))
+    {
+        drift=conf_->intValue(VServerSettings::AdaptiveUpdateIncrement);
+    }
+
+    return true;
+}
+
 int ServerHandler::secsSinceLastRefresh() const
 {
     return static_cast<int>(lastRefresh_.secsTo(QDateTime::currentDateTime()));
@@ -185,6 +209,7 @@ void ServerHandler::stopRefreshTimer()
 #ifdef __UI_SERVERUPDATE_DEBUG
     UiLog(this).dbg() << "ServerHandler::stopRefreshTimer -->";
 #endif
+    broadcast(&ServerComObserver::notifyRefreshTimerStopped);
 }
 
 void ServerHandler::startRefreshTimer()
@@ -207,6 +232,7 @@ void ServerHandler::startRefreshTimer()
         if(rate <=0) rate=1;
         refreshTimer_->setInterval(rate*1000);
         refreshTimer_->start();
+        broadcast(&ServerComObserver::notifyRefreshTimerStarted);
 	}
 
 #ifdef __UI_SERVERUPDATE_DEBUG
@@ -216,9 +242,9 @@ void ServerHandler::startRefreshTimer()
 
 void ServerHandler::updateRefreshTimer()
 {
-   UiLog(this).dbg() << "ServerHandler::updateRefreshTimer -->";
+    UiLog(this).dbg() << "ServerHandler::updateRefreshTimer -->";
 
-   if(!conf_->boolValue(VServerSettings::AutoUpdate))
+    if(!conf_->boolValue(VServerSettings::AutoUpdate))
     {
         stopRefreshTimer();
         return;
@@ -239,6 +265,7 @@ void ServerHandler::updateRefreshTimer()
 
     refreshTimer_->setInterval(rate*1000);
     refreshTimer_->start();
+    broadcast(&ServerComObserver::notifyRefreshTimerChanged);
 
 #ifdef __UI_SERVERUPDATE_DEBUG
     UiLog(this).dbg() << " refreshTimer interval: " << refreshTimer_->interval();
@@ -260,9 +287,10 @@ void ServerHandler::driftRefreshTimer()
 #ifdef __UI_SERVERUPDATE_DEBUG
         UiLog(this).dbg() << "driftRefreshTimer -->";
 #endif
-
         refreshTimer_->drift(conf_->intValue(VServerSettings::AdaptiveUpdateIncrement),
                               conf_->intValue(VServerSettings::MaxAdaptiveUpdateRate));
+
+        broadcast(&ServerComObserver::notifyRefreshTimerChanged);
     }
 
 #ifdef __UI_SERVERUPDATE_DEBUG
@@ -271,6 +299,36 @@ void ServerHandler::driftRefreshTimer()
 
 }
 
+//returns true if the current total (drifted) period is within the maximum allowed
+bool ServerHandler::checkRefreshTimerDrift() const
+{
+    if(!conf_->boolValue(VServerSettings::AutoUpdate))
+    {
+        return true;
+    }
+
+    if(activity_ != LoadActivity &&
+       conf_->boolValue(VServerSettings::AdaptiveUpdate))
+    {
+        return (refreshTimer_->interval()*1000 <
+                conf_->intValue(VServerSettings::MaxAdaptiveUpdateRate)*60);
+    }
+    return true;
+}
+
+//mark that a refresh request was sent to the queue
+void ServerHandler::refreshScheduled()
+{
+    lastRefresh_=QDateTime::currentDateTime();
+    broadcast(&ServerComObserver::notifyRefreshScheduled);
+}
+
+//mark that a refresh request was sent to the queue
+void ServerHandler::refreshFinished()
+{
+    broadcast(&ServerComObserver::notifyRefreshFinished);
+}
+
 void ServerHandler::setActivity(Activity ac)
 {
 	activity_=ac;
@@ -319,7 +377,6 @@ ServerHandler* ServerHandler::findServer(const std::string &alias)
 //This function can be called many times so we need to avoid locking the mutex.
 SState::State ServerHandler::serverState()
 {
-	SState::State state;
 	if(connectState_->state() != ConnectState::Normal || activity() == LoadActivity)
 	{
 		prevServerState_= SState::RUNNING;
@@ -487,23 +544,7 @@ void ServerHandler::manual(VTask_ptr task)
 	comQueue_->addTask(task);
 }
 
-//The user initiated a refresh
-void ServerHandler::refresh()
-{
-	//We add and refresh task to the queue. On startup this function can be called
-	//before the comQueue_ was created so we need to check if it exists.
-	if(comQueue_)
-	{
-		comQueue_->addNewsTask();
-        lastRefresh_=QDateTime::currentDateTime();
-	}
-
-    //Reset the timer to its original value (i.e. remove the drift)
-    updateRefreshTimer();
-}
-
-
-//The user initiated a refresh
+//The core refresh function. That should be the only one directly accessing the queue.
 void ServerHandler::refreshInternal()
 {
     //We add and refresh task to the queue. On startup this function can be called
@@ -511,10 +552,20 @@ void ServerHandler::refreshInternal()
     if(comQueue_)
     {
         comQueue_->addNewsTask();
-        lastRefresh_=QDateTime::currentDateTime();
     }
 }
 
+//The user initiated a refresh - using the toolbar/menu buttons or
+//called after a user command was issued
+void ServerHandler::refresh()
+{
+    refreshInternal();
+
+    //Reset the timer to its original value (i.e. remove the drift)
+    updateRefreshTimer();
+}
+
+
 //This slot is called by the timer regularly to get news from the server.
 void ServerHandler::refreshServerInfo()
 {
@@ -603,7 +654,7 @@ void ServerHandler::command(std::vector<VInfo_ptr> info, std::string cmd)
         std::map<ServerHandler*,std::string> targetParentFullNames;
 
 		//Figure out what objects (node/server) the command should be applied to
-		for(int i=0; i < info.size(); i++)
+        for(std::size_t i=0; i < info.size(); i++)
 		{
 			std::string nodeFullName;
             std::string nodeName;
@@ -849,9 +900,21 @@ void ServerHandler::broadcast(NoMethod proc,const VNode* node)
 }
 
 void ServerHandler::broadcast(NoMethodV1 proc,const VNode* node,const std::vector<ecf::Aspect::Type>& aspect,const VNodeChange& change)
-{
-	for(std::vector<NodeObserver*>::const_iterator it=nodeObservers_.begin(); it != nodeObservers_.end(); ++it)
+{       
+    //When the observers are being notified (in a loop) they might
+    //want to remove themselves from the observer list. This will cause a crash. To avoid
+    //this we create a copy of the observers and use it in the notification loop.
+    std::vector<NodeObserver*> nObsCopy=nodeObservers_;
+
+    for(std::vector<NodeObserver*>::const_iterator it=nObsCopy.begin(); it != nObsCopy.end(); ++it)
+    {
+        ((*it)->*proc)(node,aspect,change);
+    }
+
+#if 0
+    for(std::vector<NodeObserver*>::const_iterator it=nodeObservers_.begin(); it != nodeObservers_.end(); ++it)
 		((*it)->*proc)(node,aspect,change);
+#endif
 }
 
 //---------------------------------------------------------------------------
@@ -899,18 +962,25 @@ void ServerHandler::addServerObserver(ServerObserver *obs)
 
 void ServerHandler::removeServerObserver(ServerObserver *obs)
 {
-	std::vector<ServerObserver*>::iterator it=std::find(serverObservers_.begin(),serverObservers_.end(),obs);
+#ifdef __UI_SERVEROBSERVER_DEBUG
+    UI_FUNCTION_LOG_S(this)
+#endif
+    std::vector<ServerObserver*>::iterator it=std::find(serverObservers_.begin(),serverObservers_.end(),obs);
 	if(it != serverObservers_.end())
 	{
 		serverObservers_.erase(it);
 #ifdef __UI_SERVEROBSERVER_DEBUG
-        UiLog(this).dbg() << "ServerHandler::removeServerObserver --> " << obs;
+        UiLog(this).dbg() << " remove: " << obs;
 #endif
 	}
 }
 
 void ServerHandler::broadcast(SoMethod proc)
 {
+#ifdef __UI_SERVEROBSERVER_DEBUG
+    UI_FUNCTION_LOG_S(this)
+#endif
+
     bool checkExistence=true;
 
     //When the observers are being notified (in a loop) they might
@@ -923,17 +993,66 @@ void ServerHandler::broadcast(SoMethod proc)
 		//We need to check if the given observer is still in the original list. When we delete the server, due to
 		//dependencies it is possible that the observer is already deleted at this point.
 		if(!checkExistence || std::find(serverObservers_.begin(),serverObservers_.end(),*it) != serverObservers_.end())
-			((*it)->*proc)(this);
+        {
+            ((*it)->*proc)(this);
+        }
 	}
-
 }
 
+
 void ServerHandler::broadcast(SoMethodV1 proc,const VServerChange& ch)
 {
 	for(std::vector<ServerObserver*>::const_iterator it=serverObservers_.begin(); it != serverObservers_.end(); ++it)
 		((*it)->*proc)(this,ch);
 }
 
+//------------------------------------------------
+// ServerComObserver
+//------------------------------------------------
+
+void ServerHandler::addServerComObserver(ServerComObserver *obs)
+{
+    std::vector<ServerComObserver*>::iterator it=std::find(serverComObservers_.begin(),serverComObservers_.end(),obs);
+    if(it == serverComObservers_.end())
+    {
+        serverComObservers_.push_back(obs);
+#ifdef __UI_SERVERCOMOBSERVER_DEBUG
+        UiLog(this).dbg() << "ServerHandler::addServerComObserver -->  " << obs;
+#endif
+    }
+}
+
+void ServerHandler::removeServerComObserver(ServerComObserver *obs)
+{
+    std::vector<ServerComObserver*>::iterator it=std::find(serverComObservers_.begin(),serverComObservers_.end(),obs);
+    if(it != serverComObservers_.end())
+    {
+        serverComObservers_.erase(it);
+        #ifdef __UI_SERVERCOMOBSERVER_DEBUG
+            UiLog(this).dbg() << "ServerHandler::removeServerComObserver --> " << obs;
+        #endif
+    }
+}
+
+void ServerHandler::broadcast(SocMethod proc)
+{
+    bool checkExistence=true;
+
+    //When the observers are being notified (in a loop) they might
+    //want to remove themselves from the observer list. This will cause a crash. To avoid
+    //this we create a copy of the observers and use it in the notification loop.
+    std::vector<ServerComObserver*> sObsCopy=serverComObservers_;
+
+    for(std::vector<ServerComObserver*>::const_iterator it=sObsCopy.begin(); it != sObsCopy.end(); ++it)
+    {
+        //We need to check if the given observer is still in the original list. When we delete the server, due to
+        //dependencies it is possible that the observer is already deleted at this point.
+        if(!checkExistence || std::find(serverComObservers_.begin(),serverComObservers_.end(),*it) != serverComObservers_.end())
+            ((*it)->*proc)(this);
+    }
+}
+
+
 //-------------------------------------------------------------------
 // This slot is called when the comThread finished the given task!!
 //-------------------------------------------------------------------
@@ -949,6 +1068,9 @@ void ServerHandler::clientTaskFinished(VTask_ptr task,const ServerReply& serverR
 {
     UiLog(this).dbg() << "ServerHandler::clientTaskFinished -->";
 
+    //The status of the tasks sent from the info panel must be properly set to
+    //FINISHED!! Only that will notify the observers about the change!!
+
 	//See which type of task finished. What we do now will depend on that.
 	switch(task->type())
 	{
@@ -961,12 +1083,15 @@ void ServerHandler::clientTaskFinished(VTask_ptr task,const ServerReply& serverR
             UiLog(this).dbg() << " command finished - send SYNC command";
 			//comQueue_->addNewsTask();
 			comQueue_->addSyncTask();
+            updateRefreshTimer();
 			break;
 		}
 		case VTask::NewsTask:
 		{
 			// we've just asked the server if anything has changed - has it?
 
+            refreshFinished();
+
 			switch (serverReply.get_news())
 			{
 				case ServerReply::NO_NEWS:
@@ -1024,12 +1149,12 @@ void ServerHandler::clientTaskFinished(VTask_ptr task,const ServerReply& serverR
 			{
                 UiLog(this).dbg() << " full sync requested - rescanTree";
 
-				//This will update the suites
+                //This will update the suites + restart the timer
 				rescanTree();
 			}
 			else
 			{
-				broadcast(&ServerObserver::notifyEndServerSync);
+                broadcast(&ServerObserver::notifyEndServerSync);
 			}
 			break;
 		}
@@ -1101,7 +1226,7 @@ void ServerHandler::clientTaskFinished(VTask_ptr task,const ServerReply& serverR
 			task->status(VTask::FINISHED);
 
 			//Submitting the task was successful - we should now get updates from the server			
-			comQueue_->addNewsTask();
+            refresh();
 			break;
 		}
 
@@ -1110,6 +1235,7 @@ void ServerHandler::clientTaskFinished(VTask_ptr task,const ServerReply& serverR
 			//Update the suite filter with the list of suites actually loaded onto the server.
             //If the suitefilter is enabled this might have only a subset of it in our tree
             updateSuiteFilterWithLoaded(serverReply.get_string_vec());
+            task->status(VTask::FINISHED);
 			break;
 		}
 
@@ -1121,9 +1247,10 @@ void ServerHandler::clientTaskFinished(VTask_ptr task,const ServerReply& serverR
 		}
 
 		default:
-			break;
+            task->status(VTask::FINISHED);
+            break;
 
-	}
+	}                                             
 }
 
 //-------------------------------------------------------------------
@@ -1150,7 +1277,12 @@ void ServerHandler::clientTaskFailed(VTask_ptr task,const std::string& errMsg)
 			break;
 		}
 		case VTask::NewsTask:
-		case VTask::StatsTask:
+        {
+            connectionLost(errMsg);
+            refreshFinished();
+            break;
+        }
+        case VTask::StatsTask:
 		{
 			connectionLost(errMsg);
 			break;
@@ -1241,6 +1373,9 @@ void ServerHandler::reset()
 		//Indicate that we reload the defs
 		setActivity(LoadActivity);
 
+        //mark the current moment as last refresh
+        lastRefresh_=QDateTime::currentDateTime();
+
 		//NOTE: at this point the queue is not running but reset() will start it.
 		//While the queue is in reset mode it does not accept tasks.
 		comQueue_->reset();
@@ -1407,6 +1542,32 @@ void ServerHandler::rescanTree()
 // Suite filter
 //====================================================
 
+void ServerHandler::setSuiteFilterWithOne(VNode* n)
+{
+    if(n)
+    {
+        if(VNode* sn=n->suite())
+            if(VSuiteNode *suite=sn->isSuite())
+            {
+                if(suiteFilter_->isEnabled() == false)
+                {
+                    suiteFilter_->setEnabled(true);
+                    suiteFilter_->selectOnlyOne(suite->strName());
+                    //after reset the loaded suites need to be read again from the server!
+                    suiteFilter_->setLoadedInitialised(false);
+                    reset();
+                }
+                else if(suiteFilter_->isOnlyOneFiltered(suite->strName()) == false)
+                {
+                    suiteFilter_->selectOnlyOne(suite->strName());
+                    //after reset the loaded suites need to be read again from the server!
+                    suiteFilter_->setLoadedInitialised(false);
+                    reset();
+                }
+            }
+    }
+}
+
 void ServerHandler::updateSuiteFilter(SuiteFilter* sf)
 {
 	if(suiteFilter_->update(sf))
@@ -1465,7 +1626,6 @@ void ServerHandler::updateSuiteFilter()
 	}
 }
 
-
 bool ServerHandler::readFromDisk() const
 {
 	return conf_->boolValue(VServerSettings::ReadFromDisk);
@@ -1476,11 +1636,19 @@ void ServerHandler::confChanged(VServerSettings::Param par,VProperty* prop)
 	switch(par)
 	{
     case VServerSettings::AutoUpdate:
+    case VServerSettings::UpdateRate:
+    case VServerSettings::AdaptiveUpdate:
+    case VServerSettings::AdaptiveUpdateIncrement:
         updateRefreshTimer();
         break;
-    case VServerSettings::UpdateRate:
-		updateRefreshTimer();
-		break;
+    case VServerSettings::MaxAdaptiveUpdateRate:
+    {
+        if(!checkRefreshTimerDrift())
+        {
+            updateRefreshTimer();
+        }
+        break;
+    }
 	case VServerSettings::NotifyAbortedEnabled:
 	case VServerSettings::NotifyRestartedEnabled:
 	case VServerSettings::NotifyLateEnabled:
@@ -1499,12 +1667,10 @@ void ServerHandler::checkNotificationState(VServerSettings::Param par)
 	if(id.empty())
 		return;
 
-	bool enabled=false;
-
+    bool enabled=false;
 	for(std::vector<ServerHandler*>::const_iterator it=servers_.begin(); it != servers_.end(); ++it)
 	{
 		ServerHandler *s=*it;
-
 		if(s->conf()->boolValue(par))
 		{
 			enabled=true;
@@ -1512,9 +1678,27 @@ void ServerHandler::checkNotificationState(VServerSettings::Param par)
 		}
 	}
 
-	ChangeNotify::setEnabled(id,enabled);
+    ChangeNotify::updateNotificationStateFromServer(id,enabled);
 }
 
+//Called from changeNotify
+bool ServerHandler::checkNotificationState(const std::string& notifierId)
+{
+    bool enabled=false;
+    VServerSettings::Param par=VServerSettings::notificationParam(notifierId);
+
+    for(std::vector<ServerHandler*>::const_iterator it=servers_.begin(); it != servers_.end(); ++it)
+    {
+        ServerHandler *s=*it;
+        if(s->conf()->boolValue(par))
+        {
+            enabled=true;
+            break;
+        }
+    }
+
+    return enabled;
+}
 
 void ServerHandler::saveSettings()
 {
diff --git a/Viewer/src/ServerHandler.hpp b/Viewer/src/ServerHandler.hpp
index 1790100..c3ed3ce 100644
--- a/Viewer/src/ServerHandler.hpp
+++ b/Viewer/src/ServerHandler.hpp
@@ -33,12 +33,14 @@ class NodeObserver;
 class ServerHandler;
 class ServerComQueue;
 class ServerObserver;
+class ServerComObserver;
 class SuiteFilter;
 class UpdateTimer;
 class VNodeChange;
 class VServer;
 class VServerChange;
 class VSettings;
+class VSuiteNode;
 
 
 class ServerHandler : public QObject
@@ -62,6 +64,7 @@ public:
 	bool readFromDisk() const;
 	SuiteFilter* suiteFilter() const {return suiteFilter_;}
 
+    void setSuiteFilterWithOne(VNode*);
 	void updateSuiteFilter(SuiteFilter*);
 	void updateSuiteFilterWithDefs();
 
@@ -80,11 +83,14 @@ public:
 	void run(VTask_ptr);
 
 	void addNodeObserver(NodeObserver* obs);
-	void removeNodeObserver(NodeObserver* obs);
+    void removeNodeObserver(NodeObserver* obs);
 
 	void addServerObserver(ServerObserver* obs);
 	void removeServerObserver(ServerObserver* obs);
 
+    void addServerComObserver(ServerComObserver* obs);
+    void removeServerComObserver(ServerComObserver* obs);
+
 	void confChanged(VServerSettings::Param,VProperty*);
 	VServerSettings* conf() const {return conf_;}
 
@@ -103,10 +109,14 @@ public:
 	static void command(std::vector<VInfo_ptr>,std::string);
 
 	void searchBegan();
-	void searchFinished();
+	void searchFinished();    
+    bool updateInfo(int& basePeriod,int& currentPeriod,int &drift,int& toNext);
+    QDateTime lastRefresh() const {return lastRefresh_;}
     int secsSinceLastRefresh() const;
     int secsTillNextRefresh() const;
 
+    static bool checkNotificationState(const std::string& notifierId);
+
 	static ServerHandler* find(const std::string& name);
 
 protected:
@@ -121,6 +131,10 @@ protected:
 	static std::string commandToString(const std::vector<std::string>& cmd);
 	static void checkNotificationState(VServerSettings::Param par);
 
+    bool checkRefreshTimerDrift() const;
+    void refreshScheduled();
+    void refreshFinished();
+
 	std::string name_;
 	std::string host_;
 	std::string port_;
@@ -130,6 +144,7 @@ protected:
 	bool communicating_;
 	std::vector<NodeObserver*> nodeObservers_;
 	std::vector<ServerObserver*> serverObservers_;
+    std::vector<ServerComObserver*> serverComObservers_;
 
     VServer* vRoot_;
 
@@ -185,6 +200,9 @@ private:
 	void broadcast(NoMethodV1,const VNode*,const std::vector<ecf::Aspect::Type>&,const VNodeChange&);
 	void broadcast(NoMethodV2,const VNode*,const VNodeChange&);
 
+    typedef void (ServerComObserver::*SocMethod)(ServerHandler*);
+    void broadcast(SocMethod);
+
 	void saveConf();
 	void loadConf();
 
diff --git a/Viewer/src/ServerItem.cpp b/Viewer/src/ServerItem.cpp
index 156bc93..2723790 100644
--- a/Viewer/src/ServerItem.cpp
+++ b/Viewer/src/ServerItem.cpp
@@ -19,19 +19,19 @@
 
 ServerItem::ServerItem(const std::string& name) :
   name_(name),
-  useCnt_(0),
-  handler_(0),
   favourite_(false),
-  system_(false)
+  system_(false),
+  useCnt_(0),
+  handler_(0)
 {
 }
 
 ServerItem::ServerItem(const std::string& name,const std::string& host,const std::string& port, bool favourite) :
   name_(name), host_(host), port_(port),
-  useCnt_(0),
-  handler_(0),
   favourite_(favourite),
-  system_(false)
+  system_(false),
+  useCnt_(0),
+  handler_(0)
 {
 }
 
@@ -85,9 +85,9 @@ void ServerItem::registerUsageBegin()
 	if(!handler_)
 	{
 		handler_=ServerHandler::addServer(name_,host_,port_);
-        if(handler_)
-            useCnt_++;
-	}
+    }
+    if(handler_)
+        useCnt_++;
 }
 
 void ServerItem::registerUsageEnd()
diff --git a/Viewer/src/ServerList.cpp b/Viewer/src/ServerList.cpp
index a95acd8..ac07b38 100644
--- a/Viewer/src/ServerList.cpp
+++ b/Viewer/src/ServerList.cpp
@@ -355,8 +355,7 @@ bool ServerList::readRcFile()
 
 			if(vec.size() >= 3)
 			{				
-                std::string name=vec[0], host=vec[1], port=vec[2];
-                ServerItem* item=0;
+                std::string name=vec[0], host=vec[1], port=vec[2];                
                 try
                 {
                     add(name,host,port,false,false);
diff --git a/Viewer/src/ServerListDialog.cpp b/Viewer/src/ServerListDialog.cpp
index 9ad5a5c..6ac2934 100644
--- a/Viewer/src/ServerListDialog.cpp
+++ b/Viewer/src/ServerListDialog.cpp
@@ -213,8 +213,8 @@ bool ServerEditDialog::isFavourite() const
 
 ServerListDialog::ServerListDialog(Mode mode,ServerFilter *filter,QWidget *parent) :
 	QDialog(parent),
-	mode_(mode),
-	filter_(filter)
+    filter_(filter),
+    mode_(mode)
 {
 	setupUi(this);
 
diff --git a/Viewer/src/Sound.cpp b/Viewer/src/Sound.cpp
index e9e5c09..55b66b3 100644
--- a/Viewer/src/Sound.cpp
+++ b/Viewer/src/Sound.cpp
@@ -149,7 +149,7 @@ void Sound::load(VProperty* prop)
 
     if(VProperty *pp=prop->findChild("player"))
     {
-    	Sound::instance_->setCurrentPlayer(pp->valueAsString());
+    	Sound::instance_->setCurrentPlayer(pp->valueAsStdString());
     }
 
     UiLog().dbg() << "Sound:load() -- > end";
diff --git a/Viewer/src/StandardView.cpp b/Viewer/src/StandardView.cpp
new file mode 100644
index 0000000..7eebdfe
--- /dev/null
+++ b/Viewer/src/StandardView.cpp
@@ -0,0 +1,792 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 "StandardView.hpp"
+
+#include "ExpandState.hpp"
+#include "TreeNodeModel.hpp"
+#include "TreeNodeViewDelegate.hpp"
+#include "UIDebug.hpp"
+#include "UiLog.hpp"
+
+#include <QtAlgorithms>
+#include <QApplication>
+#include <QDebug>
+#include <QPainter>
+#include <QMouseEvent>
+#include <QScrollBar>
+#include <QStyledItemDelegate>
+#include <QTimerEvent>
+
+//#define _UI_STANDARDVIEW_DEBUG
+
+StandardView::StandardView(TreeNodeModel* model,QWidget* parent) :
+    AbstractNodeView(model,parent),
+    expandIndicatorBoxWidth_(20),
+    expandIndicatorWidth_(10)
+{
+    //Overwrite some base class values
+    drawConnector_=false;
+    indentation_=10;
+
+    //This is needed for making the context menu work
+    setProperty("view","tree");
+
+    //we cannot call it from the constructor of the base class
+    //because it calls a pure virtual method
+    reset();
+}
+
+StandardView::~StandardView()
+{
+
+}
+
+//Creates and initialize the viewItem structure of the children of the element
+// parentId: the items whose children are to be expanded
+// recursiveExpanding: all the children will be expanded
+// afterIsUninitialized: when we recurse from layout(-1) it indicates
+// the items after 'i' are not yet initialized and need not to be moved
+
+void StandardView::layout(int parentId, bool recursiveExpanding,bool afterIsUninitialized,bool preAllocated)
+{
+    //This is the root item.
+    if(parentId == -1)
+    {
+        rowCount_=0;
+        maxRowWidth_=0;
+    }
+
+    QModelIndex parentIndex = (parentId < 0) ? root_ : modelIndex(parentId);
+
+    if(parentId >=0 && !parentIndex.isValid())
+    {
+        //modelIndex() should never return something invalid for the real items.
+        //This can happen if columncount has been set to 0.
+        //To avoid infinite loop we stop here.
+        return;
+    }
+
+    int count=model_->rowCount(parentIndex);
+    bool expanding=true;
+
+    //This is the root item. viewItems must be empty at this point.
+    if(parentId == -1)
+    {
+        Q_ASSERT(viewItems_.empty());
+        Q_ASSERT(preAllocated == false);
+        viewItems_.resize(count);
+        afterIsUninitialized = true; //It can only be true when we expand from the root!
+    }
+    //The count of the stored children does not match the actual count
+    else if(viewItems_[parentId].total != (uint)count)
+    {
+        //Expand
+        if(!afterIsUninitialized)
+        {
+            //We called expandall for a non-root item. All the new items need must be
+            //already instered at this point. This is the duty of the caller routine.
+            //const int itemsCount = viewItems_.size();
+            //if(recursiveExpanding)
+            if(preAllocated)
+            {
+                //We called expandAll() for a non-root item. All the needed items need must already be
+                //inserted at this point. This is the duty of the caller routine!
+                //When layout() is finished we need to adjust the parent of all the items
+                //after the insertion position. This is the duty of the caller routine. We
+                //have chosen this solution for performance reasons!
+            }
+            else
+            {
+                insertViewItems(parentId + 1, count, TreeNodeViewItem());
+            }
+        }
+        //ExpandAll from the root
+        else if(count > 0)
+            viewItems_.resize(viewItems_.size() + count);
+    }
+    else
+    {
+        expanding=false;
+    }
+
+    int first = parentId + 1;
+    int last = 0;
+    int children = 0;
+    int level=(parentId >=0?viewItems_[parentId].level+1:0);
+    TreeNodeViewItem *item=0;
+
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //if(parentId >=0)
+    //    UiLog().dbg() << "layout parent=" << viewItems_[parentId].index.data().toString();
+#endif
+
+    //Iterate through the direct children of parent item. At this point all the items
+    //needed in the loop below are pre-allocated but not yet initialised.
+    for(int i=first; i < first+count; i++)
+    {
+        QModelIndex currentIndex=model_->index(i-first,0,parentIndex);
+
+        last = i + children;
+        item = &viewItems_[last];
+        item->parentItem = parentId;
+        item->index=currentIndex;
+        item->hasMoreSiblings=(i < first+count-1);
+        item->level=level;
+        item->expanded = false;
+        item->total = 0;
+
+        //We compute the size of the item. For attributes we delay the width computation until we
+        //actually paint them and we set their width to 300.
+        int w,h;
+        delegate_->sizeHint(currentIndex,w,h);
+        item->width=w;
+        item->height=h;
+
+        int xp=leftMargin_+expandIndicatorBoxWidth_; // no indentation for the root
+
+        if(parentId >=0)
+        {
+            //item->widestInSiblings=widest;
+            xp=viewItems_[parentId].x+indentation_+expandIndicatorBoxWidth_;
+        }
+        else
+        {
+            //item->widestInSiblings=item->width;
+        }
+
+        item->x=xp;
+
+        if(item->alignedRight() > maxRowWidth_)
+            maxRowWidth_=item->right();
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+            //UiLog().dbg() <<  " item=" << currentIndex.data().toString();
+#endif
+        //We need to expand the item
+        if(recursiveExpanding || isIndexExpanded(currentIndex))
+        {
+            if(recursiveExpanding)
+                expandedIndexes.insert(currentIndex);
+
+            item->expanded = true;
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+            //UiLog().dbg() <<  " is expanded";
+#endif
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+            //UiLog().dbg() <<  "  before " <<  item->index.data().toString() <<  " total=" << item->total;
+#endif
+            //Add the children to the layout
+            layout(last,recursiveExpanding,afterIsUninitialized,preAllocated);
+
+            item = &viewItems_[last];
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+            //UiLog().dbg() <<  "  after " <<  item->index.data().toString() <<  " total=" << item->total;
+#endif
+            children+=item->total;
+            item->hasChildren = item->total > 0;
+        }
+        else
+        {
+            item->hasChildren = model_->hasChildren(currentIndex);
+        }
+    }
+
+    if(!expanding)
+        return; // nothing changed
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //UiLog().dbg() << " update parent total";
+#endif
+
+    int pp=parentId;
+    while (pp > -1)
+    {
+        viewItems_[pp].total += count;
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+        //UiLog().dbg() <<  "  parent=" << viewItems_[pp].index.data().toString() <<
+        //                  "  total=" << viewItems_[pp].total;
+#endif
+
+        pp = viewItems_[pp].parentItem;
+    }
+}
+
+//Paint the rows intersecting with the given region
+void StandardView::paint(QPainter *painter,const QRegion& region)
+{
+    //Even though the viewport palette is set correctly at the
+    //beginning something sets it to another value. Here we try
+    //to detect it and correct the palette with the right colour.
+    if(expectedBg_.isValid())
+    {
+        QPalette p=viewport()->palette();
+        if(p.color(QPalette::Window) != expectedBg_)
+        {
+            p.setColor(QPalette::Window,expectedBg_);
+            viewport()->setPalette(p);
+            viewport()->update();
+            expectedBg_=QColor();
+            return;
+        }
+    }
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //UiLog().dbg() << "StandardView::paint -->";
+    //UiLog().dbg() << "sizeof(TreeNodeViewItem)=" << sizeof(TreeNodeViewItem);
+    //UiLog().dbg() << "region=" << region;
+#endif
+
+    int firstVisibleOffset=0;
+
+    //The first visible item at the top of the viewport
+    int firstVisible=firstVisibleItem(firstVisibleOffset);
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //UiLog().dbg() << "firstVisible " << firstVisible;
+#endif
+
+    if(firstVisible<0)
+        return;
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //UiLog().dbg() << "scrollX" << horizontalScrollBar()->value() << " " << viewport()->width();
+#endif
+
+    int xOffset=0;
+    if(horizontalScrollBar()->value() > 0)
+    {
+        xOffset=horizontalScrollBar()->value();
+        painter->translate(-xOffset,0);
+    }
+
+    const int itemsCount = viewItems_.size();
+    const int viewportWidth = viewport()->width();
+    QVector<QRect> rects = region.rects();
+    QVector<int> drawn;
+    bool multipleRects = (rects.size() > 1);
+
+    //Iterate through the rectangles in the region
+    for(int a = 0; a < rects.size(); ++a)
+    {
+        const QRect area = (multipleRects
+                            ? QRect(0, rects.at(a).y(), viewportWidth, rects.at(a).height())
+                            : rects.at(a));
+#ifdef _UI_STANDARDVIEW_DEBUG
+        //UiLog().dbg() << " area=" << area;
+#endif
+        std::vector<int> indentVec;
+
+        if(drawConnector_)
+        {
+            //Initialise indentVec. For each indentation level it tells us if
+            //a connector line is to be drawn. Here we scan up to the
+            //toplevel item in the firstVisible item's branch.
+            indentVec=std::vector<int>(1000,0);
+            if(firstVisible >0)
+            {
+                TreeNodeViewItem* item=&viewItems_[firstVisible];
+                int level=item->level;
+                while(item->parentItem >= 0 && level >0)
+                {
+                    TreeNodeViewItem* pt=&viewItems_[item->parentItem];
+                    if(item->hasMoreSiblings)
+                    {
+                        indentVec[item->level]=connectorPos(item);
+                    }
+                    UI_ASSERT(pt->level == level-1, "item->parentItem=" << item->parentItem <<
+                          " pt->level=" << pt->level << " level=" << level);
+                    item=pt;
+                    level--;
+                }
+            }
+        }
+
+        int i = firstVisible; // the first item at the top of the viewport
+        int y = firstVisibleOffset; // we may only see part of the first item
+
+        //start at the top of the viewport  and iterate down through the update area       
+        for (; i < itemsCount; i++)
+        {
+            int itemHeight=viewItems_[i].height;
+
+            if(drawConnector_)
+            {
+                //Adjust indentVec
+                if(viewItems_[i].hasMoreSiblings)
+                {
+                    indentVec[viewItems_[i].level]=connectorPos(&viewItems_[i]);
+                }
+                else
+                    indentVec[viewItems_[i].level]=0;
+            }
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+            //UiLog().dbg() << "row: " << i << " " << itemHeight;
+#endif
+            //Try to find the first item int the current rect
+            if(y + itemHeight > area.top())
+                break;
+            y += itemHeight;
+        }
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+        //UiLog().dbg() << "y: " << y << " " << area.bottom();
+#endif
+
+        //Paint the visible rows in the current rect
+        for (; i < itemsCount && y <= area.bottom(); i++)
+        {
+            if(!multipleRects || !drawn.contains(i))
+            {           
+                //Draw a whole row. It will update y,itemsInRow and indentVec!!
+                drawRow(painter,i,xOffset,y,indentVec);
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+                //UiLog().dbg() << " row rendered - item=" << i << " y=" << y;
+#endif
+            }
+            else
+            {
+                int rh=viewItems_[i].height;
+                y+=rh;
+#ifdef _UI_STANDARDVIEW_DEBUG
+                //UiLog().dbg() << " row skipped  - item=" << i << " y=" << y;
+#endif
+            }
+
+            if(multipleRects)
+               drawn.append(i);
+        }
+    }
+}
+
+//Draw a whole row
+void StandardView::drawRow(QPainter* painter,int start,int xOffset,int& yp,std::vector<int>& indentVec)
+{
+    TreeNodeViewItem* item=&(viewItems_[start]);
+
+    //Get the rowheight
+    int rh=item->height;
+
+    //See if there are no multiline items in this row
+    bool singleRow=delegate_->isSingleHeight(rh);
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //UiLog().dbg() << "  item=" << " " << item->index.data().toString();
+#endif
+
+    //Find out the indentation level of the row
+    int firstLevel=item->level;
+
+    //Init style option
+    QStyleOptionViewItem opt;
+    if(selectionModel_->isSelected(item->index))
+        opt.state |= QStyle::State_Selected;
+
+    int optWidth=2000;
+    if(item->width > optWidth)
+        optWidth=item->width;
+    opt.rect=QRect(item->x,yp,optWidth,item->height);
+
+    //We do not render the item if it is outisde the viewport and
+    //its parent's right is also outside the viewport. Here we considered that
+    //the connector line is always drawn from the child to the parent.
+    bool needToDraw=true;
+#if 0
+    if(item->parentItem >=0)
+    {
+            if(viewItems_[item->parentItem].right() >= translation() + viewportWidth)
+                needToDraw=false;
+        }
+#endif
+    if(needToDraw)
+    {
+        //For single rows we center items halfway through the rowHeight
+#if 0
+        if(singleRow)
+        {
+           if(item->height < rh)
+                {
+                    opt.rect.moveTop(yp+(rh-item->height)/2);
+                }
+        }
+#endif
+
+            //QRect vr=visualRect(item->index);
+            //painter->fillRect(vr,QColor(120,120,120,120));
+
+//#ifdef _UI_STANDARDVIEW_DEBUG
+//          UiLog().dbg() << "  optRect=" << opt.rect << " visRect=" << vr;
+//#endif
+
+        //Draw the item with the delegate
+        QSize paintedSize;
+        delegate_->paint(painter,opt,item->index,paintedSize);
+
+        //we have to know if the item width/height is the same that we expected.
+        //This can happen when:
+        // -we set a fixed initial width for the item (e.g. for an attribute)
+        //  and now we got the real width
+        // -the number of icons or additional extra information
+        //  changed for a node (so the width changed)
+        // -the number of lines changed in a multiline label (so the height changed)
+        // -the node becomes submitted
+        bool wChanged=paintedSize.width() != item->width;
+        bool hChanged=paintedSize.height() != item->height;
+
+        if(wChanged || hChanged)
+        {            
+            //set new size
+            item->width=paintedSize.width();
+            item->height=paintedSize.height();
+
+            if(item->right() > maxRowWidth_)
+            {
+                maxRowWidth_=item->right();
+                doDelayedWidthAdjustment();
+            }
+            else if(hChanged)
+            {
+                doDelayedWidthAdjustment();
+            }           
+        }
+
+        //draw expand indicator
+        if(item->hasChildren)
+        {
+            //We draw a triangle into the middle of the expand indicator box
+            float indX=item->x-expandIndicatorBoxWidth_/2;
+            float indY=yp+item->height/2;
+
+            //painter->drawRect(QRect(indX-expandIndicatorBoxWidth_/2,indY-item->height/2,
+            //                        expandIndicatorBoxWidth_,expandIndicatorBoxWidth_));
+
+            float tw=expandIndicatorWidth_;
+            float th=tw/2.*0.95;
+
+            QPolygonF shape;
+            if(item->expanded)
+            {
+                shape << QPointF(indX-tw/2,indY-0.2*th) <<
+                     QPointF(indX+tw/2,indY-0.2*th) <<
+                     QPointF(indX,indY+0.8*th);
+            }
+            else
+            {
+                shape << QPointF(indX,indY-tw/2.) <<
+                     QPointF(indX,indY+tw/2.) <<
+                     QPointF(indX+th,indY);
+            }
+
+            QPen oriPen=painter->pen();
+            painter->setPen(Qt::NoPen);
+            painter->setBrush(QColor(71,71,70));
+            painter->setRenderHint(QPainter::Antialiasing,true);
+            painter->drawPolygon(shape);
+            painter->setRenderHint(QPainter::Antialiasing,false);
+            painter->setPen(oriPen);
+        }
+
+        //Draw the connector lines
+        if(drawConnector_)
+        {
+            painter->setPen(connectorColour_);
+
+            int lineX1=item->x-expandIndicatorBoxWidth_/2;
+            int lineY=yp+item->height/2;
+
+            //For multiline labels the connector shoudl be close to the top
+            //not in the middle. We use the parentitem's height to find the proper
+            //y position.
+            if(!singleRow && item->parentItem >=0)
+            {
+                lineY=yp+viewItems_[item->parentItem].height/2;
+            }
+
+            if(item->hasMoreSiblings)
+            {
+                indentVec[item->level]=lineX1;
+            }
+            else
+                indentVec[item->level]=0;
+
+            //If not a top level item (e.i. not a server) and a leaf we need to draw
+            //a connector line straight to the item
+            if(item->parentItem >=0 && item->hasChildren == 0)
+            {
+                int lineX2=item->x-connectorGap_;
+
+                //First child
+                if(item->index.row() == 0)
+                {
+                    //horizontal line to the node
+                    painter->drawLine(lineX1,lineY,lineX2,lineY);
+
+                    //vertical line to the parent
+                    painter->drawLine(lineX1,lineY,lineX1,yp);
+
+                    //line towards the siblings  - downwards
+                    if(item->hasMoreSiblings)
+                    {
+                        painter->drawLine(lineX1,lineY,lineX1,yp+rh);
+                    }
+                }
+
+                //Child in the middle - has sibling both upwards and downwards
+                else if(item->hasMoreSiblings)
+                {
+                    //horizontal line to the node
+                    painter->drawLine(lineX1,lineY,lineX2,lineY);
+
+                    //vertical line to the parent and sibling
+                    painter->drawLine(lineX1,yp,lineX1,yp+rh);
+                }
+
+                //The last child - has sibling only upwards
+                else
+                {
+                    //horizontal line to the node
+                    painter->drawLine(lineX1,lineY,lineX2,lineY);
+
+                    //vertical line to the parent
+                    painter->drawLine(lineX1,lineY,lineX1,yp);
+                }
+            }
+
+            //Draw the vertical connector lines for all the levels
+            //preceding the first level in the row!
+            painter->setPen(connectorColour_);
+            for(int j=0; j < firstLevel; j++)
+            {
+                int xp=indentVec[j];
+                if(xp != 0)
+                    painter->drawLine(xp,yp,xp,yp+rh);
+            }
+        }
+    }
+
+    yp+=rh;
+}
+
+int StandardView::connectorPos(TreeNodeViewItem* item) const
+{
+    return item->x-expandIndicatorBoxWidth_/2;
+}
+
+int StandardView::itemRow(int item) const
+{
+    return item;
+}
+
+int StandardView::firstVisibleItem(int &offset) const
+{
+    const int value = verticalScrollBar()->value();
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //UiLog().dbg() << "CompactNodeView::firstVisibleItem --> value=" << value;
+#endif
+
+    if (verticalScrollMode_ == ScrollPerItem)
+    {
+        offset = 0;
+        //value is the row number
+
+        if(value <0 || value >= rowCount_)
+            return -1;
+
+        return value;
+    }
+
+    return -1;
+}
+
+
+//This has to be very quick. Called after each collapse/expand.
+void StandardView::updateRowCount()
+{
+    rowCount_=static_cast<int>(viewItems_.size());
+
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //UiLog().dbg() << "CompactNodeView::updateRowCount --> " << rowCount_;
+#endif
+}
+
+void StandardView::updateScrollBars()
+{
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //UiLog().dbg() << "CompactNodeView::updateScrollBars -->";
+#endif
+
+    QSize viewportSize = viewport()->size();
+    if(!viewportSize.isValid())
+        viewportSize = QSize(0, 0);
+
+    if(viewItems_.empty())
+    {
+        //doItemsLayout();
+    }
+
+    int itemsInViewport = 0;
+
+    const int itemsCount = viewItems_.size();
+    if(itemsCount ==0)
+        return;
+
+    const int viewportHeight = viewportSize.height();    
+    for(int height = 0, item = itemsCount - 1; item >= 0; item--)
+    {
+        //UiLog().dbg() << "item=" << item;
+        height +=viewItems_[item].height;
+        if(height > viewportHeight)
+            break;
+        itemsInViewport++;
+    }
+#ifdef _UI_STANDARDVIEW_DEBUG
+    //UiLog().dbg() << "  itemsCount=" << itemsCount << " rowCount=" << rowCount_;
+    //UiLog().dbg() << "  itemsInViewport " << itemsInViewport;
+#endif
+
+    if(verticalScrollMode_ == ScrollPerItem)
+    {
+        if(!viewItems_.empty())
+            itemsInViewport = qMax(1, itemsInViewport);
+
+        //verticalScrollBar()->setRange(0, itemsCount - itemsInViewport);
+        verticalScrollBar()->setRange(0, rowCount_ - itemsInViewport);
+        verticalScrollBar()->setPageStep(itemsInViewport);
+        verticalScrollBar()->setSingleStep(1);
+    }
+    else
+    {
+        // scroll per pixel
+    }
+
+    //Horizontal scrollbar
+    if(viewportSize.width() < maxRowWidth_)
+    {
+        horizontalScrollBar()->setRange(0,maxRowWidth_+10-viewportSize.width());
+        horizontalScrollBar()->setPageStep(viewportSize.width());
+        horizontalScrollBar()->setSingleStep(1);
+    }
+    else
+    {
+        horizontalScrollBar()->setRange(0,0);
+    }
+}
+
+/*
+  Returns the rectangle on the viewport occupied by the item at \a index.
+  If the index is not visible or explicitly hidden, the returned rectangle is invalid.
+*/
+QRect StandardView::visualRect(const QModelIndex &index) const
+{
+    //if (!d->isIndexValid(index) || isIndexHidden(index))
+    //    return QRect();
+
+    //d->executePostedLayout();
+
+    int vi = viewIndex(index);
+    if (vi < 0)
+        return QRect();
+
+    int y =coordinateForItem(vi);
+    if(y >=0)
+    {
+        //return QRect(viewItems_[vi].x, y, viewItems_[vi].width,rh); //TODO: optimise it
+        return QRect(viewItems_[vi].x-1-translation(), y, viewItems_[vi].width+2,viewItems_[vi].height);
+    }
+    return QRect();
+}
+
+//Returns the viewport y coordinate for  item.
+int StandardView::coordinateForItem(int item) const
+{
+    if(verticalScrollMode_ == ScrollPerItem)
+    {
+        int offset = 0;
+        //firstVisibleItem must always start a row!!!!
+        int topViewItemIndex=firstVisibleItem(offset);
+        if (item >= topViewItemIndex)
+        {
+            // search in the visible area first and continue down
+            // ### slow if the item is not visible
+
+            const int itemsCount = viewItems_.size();
+            const int viewportHeight = viewport()->size().height();
+
+            for(int height = 0, viewItemIndex = topViewItemIndex;
+                height <= viewportHeight && viewItemIndex < itemsCount; viewItemIndex++)
+            {
+                int h=viewItems_[viewItemIndex].height;
+                if(viewItemIndex ==item)
+                {                                 
+                    return height;
+                }
+                height +=h;
+            }
+        }
+    }
+
+
+    return -1;
+}
+
+//coordinate is in viewport coordinates
+int StandardView::itemAtCoordinate(const QPoint& coordinate) const
+{
+    const std::size_t itemCount = viewItems_.size();
+    if(itemCount == 0)
+        return -1;
+
+    if(verticalScrollMode_ == ScrollPerItem)
+    {
+        //int topRow = verticalScrollBar()->value();
+
+        int offset = 0;
+        int topViewItemIndex=firstVisibleItem(offset);
+
+        if(coordinate.y() >= 0)
+        {
+            // the coordinate is in or below the viewport
+            int viewItemCoordinate = 0;           
+            for(std::size_t viewItemIndex = topViewItemIndex; viewItemIndex < itemCount; viewItemIndex++)
+            {
+                viewItemCoordinate += viewItems_[viewItemIndex].height;
+                if (viewItemCoordinate > coordinate.y())
+                {
+                    //viewItemIndex=itemAtRowCoordinate(viewItemIndex,itemsInRow,coordinate.x()+translation());
+                    return (viewItemIndex >= itemCount ? -1 : viewItemIndex);
+                }
+            }
+        }
+    }
+
+    return -1;
+}
+
+bool StandardView::isPointInExpandIndicator(int item,QPoint p) const
+{
+    const int itemCount = static_cast<int>(viewItems_.size());
+    return item >=0 && item < itemCount &&
+           p.x() > viewItems_[item].x-expandIndicatorBoxWidth_ &&
+           p.x() < viewItems_[item].x-2;
+}
+
+void StandardView::updateViewport(const QRect rect)
+{
+    if(rect.right() < viewport()->rect().right())
+        viewport()->update(rect.adjusted(0,0,viewport()->rect().right()-rect.right(),0));
+    else
+        viewport()->update(rect);
+}
diff --git a/Viewer/src/StandardView.hpp b/Viewer/src/StandardView.hpp
new file mode 100644
index 0000000..2416378
--- /dev/null
+++ b/Viewer/src/StandardView.hpp
@@ -0,0 +1,63 @@
+//============================================================================
+// Copyright 2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 STANDARDVIEW_HPP
+#define STANDARDVIEW_HPP
+
+#include <QAbstractScrollArea>
+#include <QBasicTimer>
+#include <QItemSelectionModel>
+#include <QMap>
+#include <QModelIndex>
+#include <QPointer>
+#include <QSet>
+#include <QStyleOptionViewItem>
+
+#include "AbstractNodeView.hpp"
+
+class TreeNodeModel;
+class GraphNodeViewItem;
+class QStyledItemDelegate;
+
+//Implements a standard tree view (similar to QTreeView) where there is
+//one item per row
+
+class StandardView : public AbstractNodeView
+{
+public:
+    explicit StandardView(TreeNodeModel* model,QWidget *parent=0);
+    ~StandardView();
+
+    QRect visualRect(const QModelIndex &index) const;
+
+protected:
+    void paint(QPainter *painter,const QRegion& region);
+    void drawRow(QPainter* painter,int start,int xOffset,int &yp,std::vector<int>&);
+
+    void layout(int parentId, bool recursiveExpanding,bool afterIsUninitialized,bool preAllocated);
+
+    int itemRow(int item) const;
+    int coordinateForItem(int item) const;
+    int itemAtCoordinate(const QPoint& coordinate) const;
+    bool isPointInExpandIndicator(int,QPoint) const;
+
+    int  firstVisibleItem(int &offset) const;
+    void updateRowCount();
+    void updateScrollBars();
+    void updateViewport(const QRect rect);
+
+    int expandIndicatorBoxWidth_;
+    int expandIndicatorWidth_;
+
+private:
+    int connectorPos(TreeNodeViewItem* item) const;
+};
+
+#endif // STANDARDVIEW_HPP
diff --git a/Viewer/src/SuiteFilter.cpp b/Viewer/src/SuiteFilter.cpp
index 10cfe36..c7d8311 100644
--- a/Viewer/src/SuiteFilter.cpp
+++ b/Viewer/src/SuiteFilter.cpp
@@ -157,6 +157,27 @@ void SuiteFilter::setFiltered(int index,bool val)
 }
 
 
+bool SuiteFilter::isOnlyOneFiltered(const std::string& oneSuite) const
+{
+    const std::vector<std::string>& current=filter();
+    return (current.size() == 1 && current[0] != oneSuite);
+}
+
+void SuiteFilter::selectOnlyOne(const std::string& oneSuite)
+{
+    if(isOnlyOneFiltered(oneSuite))
+        return;
+
+    unselectAll();
+    for(std::vector<SuiteFilterItem>::iterator it=items_.begin(); it != items_.end(); ++it)
+    {
+        if((*it).name() == oneSuite)
+        {
+            (*it).filtered_=true;
+            return;
+        }
+    }
+}
 
 SuiteFilter* SuiteFilter::clone()
 {
@@ -181,7 +202,7 @@ bool SuiteFilter::loadedSameAs(const std::vector<std::string>& loaded) const
             cnt++;
     }
 
-    return cnt == loaded.size();
+    return cnt == static_cast<int>(loaded.size());
 }
 
 bool SuiteFilter::setLoaded(const std::vector<std::string>& loaded,bool checkDiff)
diff --git a/Viewer/src/SuiteFilter.hpp b/Viewer/src/SuiteFilter.hpp
index f958ece..11d466f 100644
--- a/Viewer/src/SuiteFilter.hpp
+++ b/Viewer/src/SuiteFilter.hpp
@@ -79,13 +79,16 @@ public:
 	void current(const std::vector<std::string>& suites);
 	int count() const {return static_cast<int>(items_.size());}
 	void setFiltered(int index,bool val);
+    bool isOnlyOneFiltered(const std::string& oneSuite) const;
     bool isLoadedInitialised() const {return loadedInitialised_;}
-	bool autoAddNewSuites() const {return autoAddNew_;}
+    bool autoAddNewSuites() const {return autoAddNew_;}
 	bool isEnabled() const {return enabled_;}
 
-	void setAutoAddNewSuites(bool b) {autoAddNew_=b;}
+    void setLoadedInitialised(bool b) {loadedInitialised_=b;}
+    void setAutoAddNewSuites(bool b) {autoAddNew_=b;}
 	void setEnabled(bool b) {enabled_=b;}
-	void selectAll();
+    void selectOnlyOne(const std::string& oneSuite);
+    void selectAll();
 	void unselectAll();
     bool removeUnloaded();
     bool hasUnloaded() const;
diff --git a/Viewer/src/TableFilterWidget.cpp b/Viewer/src/TableFilterWidget.cpp
index 633d096..b342629 100644
--- a/Viewer/src/TableFilterWidget.cpp
+++ b/Viewer/src/TableFilterWidget.cpp
@@ -86,7 +86,8 @@ void TableFilterWidget::slotHeaderFilter(QString column,QPoint globalPos)
         //if(!op->selection().isEmpty())
         sf.setCurrent(op->selection());
 
-        VParamFilterMenu* sfm= new VParamFilterMenu(menu,&sf,"Status filter",
+        //The menu takes ownership of it
+        new VParamFilterMenu(menu,&sf,"Status filter",
                           VParamFilterMenu::FilterMode,VParamFilterMenu::ColourDecor);
 
 		if(menu->exec(globalPos) != NULL)
diff --git a/Viewer/src/TableNodeModel.cpp b/Viewer/src/TableNodeModel.cpp
index 92a9224..853cd53 100644
--- a/Viewer/src/TableNodeModel.cpp
+++ b/Viewer/src/TableNodeModel.cpp
@@ -303,38 +303,6 @@ QModelIndex TableNodeModel::attributeToIndex(const VAttribute* a, int column) co
     return QModelIndex();
 }
 
-QModelIndex TableNodeModel::forceShowNode(const VNode* node) const
-{
-#if 0
-    if(!node)
-        return QModelIndex();
-
-    Q_ASSERT(node);
-    Q_ASSERT(!node->isServer());
-    Q_ASSERT(node->server());
-
-    if(VModelServer *mserver=data_->server(node->server()))
-    {
-        VTableServer* server=mserver->tableServer();
-        server->setForceShowNode(node);
-        return nodeToIndex(node);
-    }
-#endif
-    return QModelIndex();
-}
-
-QModelIndex TableNodeModel::forceShowAttribute(const VAttribute* a) const
-{
-#if 0
-    Q_ASSERT(a);
-    VNode* node=a->parent();
-    Q_ASSERT(node);
-
-    return forceShowNode(const_cast<VNode*>(node));
-#endif
-    return QModelIndex();
-}
-
 void TableNodeModel::selectionChanged(QModelIndexList lst)
 {
 #if 0
diff --git a/Viewer/src/TableNodeModel.hpp b/Viewer/src/TableNodeModel.hpp
index d813674..e66653d 100644
--- a/Viewer/src/TableNodeModel.hpp
+++ b/Viewer/src/TableNodeModel.hpp
@@ -87,9 +87,6 @@ protected:
 
 	QVariant nodeData(const QModelIndex& index,int role) const;
 
-    QModelIndex forceShowNode(const VNode* node) const;
-    QModelIndex forceShowAttribute(const VAttribute* a) const;
-
 	VTableModelData* data_;
 	ModelColumn* columns_;
 };
diff --git a/Viewer/src/TableNodeView.cpp b/Viewer/src/TableNodeView.cpp
index 9e22c0e..0cdcec7 100644
--- a/Viewer/src/TableNodeView.cpp
+++ b/Viewer/src/TableNodeView.cpp
@@ -74,7 +74,7 @@ TableNodeView::TableNodeView(TableNodeSortModel* model,NodeFilterDef* filterDef,
 	connect(this,SIGNAL(doubleClicked(const QModelIndex&)),
 			this,SLOT(slotDoubleClickItem(const QModelIndex)));
 
-	actionHandler_=new ActionHandler(this);
+    actionHandler_=new ActionHandler(this,this);
 
 	//expandAll();
 
@@ -134,6 +134,10 @@ QWidget* TableNodeView::realWidget()
 	return this;
 }
 
+QObject* TableNodeView::realObject()
+{
+    return this;
+}
 
 //Collects the selected list of indexes
 QModelIndexList TableNodeView::selectedList()
@@ -190,8 +194,8 @@ void TableNodeView::setCurrentSelection(VInfo_ptr info)
     if(idx.isValid())
     {
 #ifdef _UI_TABLENODEVIEW_DEBUG
-    if(info)
-        UiLog().dbg() << "TableNodeView::setCurrentSelection --> " <<  info->path();
+        if(info)
+            UiLog().dbg() << "TableNodeView::setCurrentSelection --> " <<  info->path();
 #endif
         setCurrentIndex(idx);
     }
@@ -236,18 +240,8 @@ void TableNodeView::handleContextMenu(QModelIndex indexClicked,QModelIndexList i
 		}
 }
 
-void TableNodeView::slotViewCommand(std::vector<VInfo_ptr> nodeLst,QString cmd)
+void TableNodeView::slotViewCommand(VInfo_ptr info,QString cmd)
 {
-
-	if(nodeLst.size() == 0)
-		return;
-
-	if(cmd == "set_as_root")
-	{
-        UiLog().dbg() << "set as root";
-		//model_->setRootNode(nodeLst.at(0)->node());
-		//expandAll();
-	}
 }
 
 void TableNodeView::rerender()
diff --git a/Viewer/src/TableNodeView.hpp b/Viewer/src/TableNodeView.hpp
index 0192cee..bed86ae 100644
--- a/Viewer/src/TableNodeView.hpp
+++ b/Viewer/src/TableNodeView.hpp
@@ -39,7 +39,8 @@ public:
 
     void reload() {}
 	void rerender();
-	QWidget* realWidget();
+    QWidget* realWidget();
+    QObject* realObject();
 	VInfo_ptr currentSelection();
     void setCurrentSelection(VInfo_ptr n);
 	void selectFirstServer() {}
@@ -53,11 +54,10 @@ public:
 public Q_SLOTS:
 	void slotDoubleClickItem(const QModelIndex&);
 	void slotContextMenu(const QPoint &position);
-	void slotViewCommand(std::vector<VInfo_ptr>,QString);
+    void slotViewCommand(VInfo_ptr,QString);
 	void slotHeaderContextMenu(const QPoint &position);
 	void slotSizeHintChangedGlobal();
     void slotRerender();
-    void slotViewCommand(VInfo_ptr,QString) {}
 
 Q_SIGNALS:
 	void selectionChanged(VInfo_ptr);
diff --git a/Viewer/src/TableNodeViewDelegate.cpp b/Viewer/src/TableNodeViewDelegate.cpp
index 18a4311..6c31625 100644
--- a/Viewer/src/TableNodeViewDelegate.cpp
+++ b/Viewer/src/TableNodeViewDelegate.cpp
@@ -155,8 +155,9 @@ void TableNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &
     			QMap<QString,AttributeRendererProc>::const_iterator it=attrRenderers_.find(lst.at(0));
     			if(it != attrRenderers_.end())
     			{
-    				AttributeRendererProc a=it.value();
-    				(this->*a)(painter,lst,vopt);
+                    QSize size;
+                    AttributeRendererProc a=it.value();
+                    (this->*a)(painter,lst,vopt,size);
     			}
     		}
     	}
diff --git a/Viewer/src/TableNodeWidget.cpp b/Viewer/src/TableNodeWidget.cpp
index 30869e1..c4efb83 100644
--- a/Viewer/src/TableNodeWidget.cpp
+++ b/Viewer/src/TableNodeWidget.cpp
@@ -169,7 +169,7 @@ void TableNodeWidget::rerender()
 }
 
 
-void TableNodeWidget::writeSettings(VSettings* vs)
+void TableNodeWidget::writeSettings(VComboSettings* vs)
 {
 	vs->put("type",type_);
 	vs->put("dockId",id_);
@@ -184,7 +184,7 @@ void TableNodeWidget::writeSettings(VSettings* vs)
     DashboardWidget::writeSettings(vs);
 }
 
-void TableNodeWidget::readSettings(VSettings* vs)
+void TableNodeWidget::readSettings(VComboSettings* vs)
 {
 	std::string type=vs->get<std::string>("type","");
 	if(type != type_)
diff --git a/Viewer/src/TableNodeWidget.hpp b/Viewer/src/TableNodeWidget.hpp
index 81b01a9..ddecab0 100644
--- a/Viewer/src/TableNodeWidget.hpp
+++ b/Viewer/src/TableNodeWidget.hpp
@@ -30,8 +30,8 @@ public:
     void populateDockTitleBar(DashboardDockTitleWidget* tw);
     void rerender();
 
-	void writeSettings(VSettings*);
-	void readSettings(VSettings*);
+    void writeSettings(VComboSettings*);
+    void readSettings(VComboSettings*);
 
 protected Q_SLOTS:
 	void on_actionBreadcrumbs_triggered(bool b);
diff --git a/Viewer/src/TextPager/TextPagerDocument.cpp b/Viewer/src/TextPager/TextPagerDocument.cpp
index 235eb51..6601e0e 100644
--- a/Viewer/src/TextPager/TextPagerDocument.cpp
+++ b/Viewer/src/TextPager/TextPagerDocument.cpp
@@ -288,6 +288,7 @@ QStringRef TextPagerDocument::readRef(int pos, int size) const
     return QStringRef();
 }
 
+#if 0
 static bool isSameFile(const QIODevice *left, const QIODevice *right)
 {
     if (left == right)
@@ -299,6 +300,7 @@ static bool isSameFile(const QIODevice *left, const QIODevice *right)
     }
     return false;
 }
+#endif
 
 int TextPagerDocument::documentSize() const
 {
@@ -460,9 +462,9 @@ TextPagerCursor TextPagerDocument::find(const QRegExp &regexp, const TextPagerCu
         }
     }
 
-    const TextDocumentIterator::Direction direction = (reverse
-                                                       ? TextDocumentIterator::Left
-                                                       : TextDocumentIterator::Right);
+    //const TextDocumentIterator::Direction direction = (reverse
+    //                                                   ? TextDocumentIterator::Left
+    //                                                   : TextDocumentIterator::Right);
     TextDocumentIterator it(d, pos);
     if (reverse) {
         it.setMinBoundary(limit);
@@ -471,13 +473,13 @@ TextPagerCursor TextPagerDocument::find(const QRegExp &regexp, const TextPagerCu
     }
     const QLatin1Char newline('\n');   
     bool ok = true;
-    int progressInterval = 0;
+    //int progressInterval = 0;
     const FindScope scope(flags & FindAllowInterrupt ? &d->findState : 0);
     QTime lastProgressTime;
     if (flags & FindAllowInterrupt) {
-        progressInterval = qMax<int>(1, (reverse
-                                         ? (static_cast<qreal>(pos) / static_cast<qreal>(TEXTDOCUMENT_FIND_INTERVAL_PERCENTAGE))
-                                         : (static_cast<qreal>(d->documentSize) - static_cast<qreal>(pos)) / 100.0));
+        //progressInterval = qMax<int>(1, (reverse
+        //                                 ? (static_cast<qreal>(pos) / static_cast<qreal>(TEXTDOCUMENT_FIND_INTERVAL_PERCENTAGE))
+        //                                 : (static_cast<qreal>(d->documentSize) - static_cast<qreal>(pos)) / 100.0));
         //maxFindLength = (reverse ? pos : d->documentSize - pos);
         lastProgressTime.start();
     }
@@ -649,7 +651,7 @@ TextPagerCursor TextPagerDocument::find(const QString &in, const TextPagerCursor
     }
 
     // ### what if one searches for a string with non-word characters in it and FindWholeWords?
-    const TextDocumentIterator::Direction direction = (reverse ? TextDocumentIterator::Left : TextDocumentIterator::Right);
+    //const TextDocumentIterator::Direction direction = (reverse ? TextDocumentIterator::Left : TextDocumentIterator::Right);
     QString word = caseSensitive ? in : in.toLower();
 
     TextDocumentIterator it(d, pos);
@@ -667,7 +669,7 @@ TextPagerCursor TextPagerDocument::find(const QString &in, const TextPagerCursor
         it.setConvertToLowerCase(true);
 
     bool ok = true;
-    QChar ch = it.current();
+    //QChar ch = it.current();
     //int progressInterval = 0;
     const FindScope scope(flags & FindAllowInterrupt ? &d->findState : 0);
     QTime lastProgressTime;
diff --git a/Viewer/src/TextPager/TextPagerEdit.cpp b/Viewer/src/TextPager/TextPagerEdit.cpp
index 846101e..a0f2cec 100644
--- a/Viewer/src/TextPager/TextPagerEdit.cpp
+++ b/Viewer/src/TextPager/TextPagerEdit.cpp
@@ -1587,7 +1587,6 @@ int TextEditPrivate::findLastPageSize() const
 
     int start = documentSize-maxCharNum;
     if(start < 0) start=0;
-    int i = 0;
 #ifdef DEBUG_TEXTPAGER_LASTPAGESIZE 
     QTime tm;
     tm.start();
diff --git a/Viewer/src/TextPager/TextPagerSearchInterface.cpp b/Viewer/src/TextPager/TextPagerSearchInterface.cpp
index f8afee8..8c10823 100644
--- a/Viewer/src/TextPager/TextPagerSearchInterface.cpp
+++ b/Viewer/src/TextPager/TextPagerSearchInterface.cpp
@@ -159,7 +159,7 @@ void TextPagerSearchInterface::automaticSearchForKeywords(bool userClickedReload
 		// search direction
 		QTextDocument::FindFlags findFlags;
 		TextPagerCursor cursor(editor_->textCursor());
-		std::string searchFrom = vpAutomaticSearchFrom_->valueAsString();
+		std::string searchFrom = vpAutomaticSearchFrom_->valueAsStdString();
 		QTextCursor::MoveOperation move;
 
 		if (searchFrom == "bottom")
@@ -178,11 +178,11 @@ void TextPagerSearchInterface::automaticSearchForKeywords(bool userClickedReload
 			findFlags = findFlags | QTextDocument::FindCaseSensitively;
 
 		// string match mode
-		std::string matchMode(vpAutomaticSearchMode_->valueAsString());
+		std::string matchMode(vpAutomaticSearchMode_->valueAsStdString());
 		StringMatchMode::Mode mode = StringMatchMode::operToMode(matchMode);
 
 		// the term to be searched for
-		std::string searchTerm_s(vpAutomaticSearchText_->valueAsString());
+		std::string searchTerm_s(vpAutomaticSearchText_->valueAsStdString());
 		QString searchTerm = QString::fromStdString(searchTerm_s);
 
 		// perform the search
diff --git a/Viewer/src/ToolTipFormat.cpp b/Viewer/src/ToolTipFormat.cpp
new file mode 100644
index 0000000..af24b2b
--- /dev/null
+++ b/Viewer/src/ToolTipFormat.cpp
@@ -0,0 +1,50 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 "ToolTipFormat.hpp"
+
+#include <QAction>
+#include <QColor>
+
+static QColor shortCutCol(147,165,202);
+
+namespace Viewer
+{
+
+QString formatShortCut(QString text)
+{
+    return "<code><font color=\'" + shortCutCol.name() + "\'>" + text + "</font></code>";
+}
+
+
+QString formatShortCut(QAction* ac)
+{
+    Q_ASSERT(ac);
+
+    return "<code><font color=\'" + shortCutCol.name() + "\'> (" +
+        ac->shortcut().toString() + ")</font></code>";
+}
+
+void addShortCutToToolTip(QList<QAction*> alst)
+{
+    Q_FOREACH(QAction *ac,alst)
+    {
+        if(!ac->shortcut().isEmpty())
+        {
+            QString tt=ac->toolTip();
+            if(!tt.isEmpty())
+            {
+                tt+=" " + formatShortCut(ac);
+                ac->setToolTip(tt);
+            }
+        }
+    }
+}
+
+} //namespace Viewer
diff --git a/Viewer/src/TriggerTextWidget.hpp b/Viewer/src/ToolTipFormat.hpp
similarity index 65%
copy from Viewer/src/TriggerTextWidget.hpp
copy to Viewer/src/ToolTipFormat.hpp
index 11fb926..b2dc4e3 100644
--- a/Viewer/src/TriggerTextWidget.hpp
+++ b/Viewer/src/ToolTipFormat.hpp
@@ -7,16 +7,19 @@
 // nor does it submit to any jurisdiction.
 //============================================================================
 
-#ifndef TRIGGERTEXTWIDGET_HPP
-#define TRIGGERTEXTWIDGET_HPP
+#ifndef TOOLTIPFORMAT_HPP
+#define TOOLTIPFORMAT_HPP
 
-#include <QTextBrowser>
+#include <QList>
+#include <QString>
 
-class TriggerTextWidget : public QTextBrowser
-{
-public:
-    explicit TriggerTextWidget(QWidget *parent=0);
-};
+class QAction;
 
-#endif
+namespace Viewer
+{
+    QString formatShortCut(QString);
+    QString formatShortCut(QAction*);
+    void addShortCutToToolTip(QList<QAction*>);
+} //namespace Viewer
 
+#endif // TOOLTIPFORMAT_HPP
diff --git a/Viewer/src/TreeNodeModel.cpp b/Viewer/src/TreeNodeModel.cpp
index 99c10bf..f072caf 100644
--- a/Viewer/src/TreeNodeModel.cpp
+++ b/Viewer/src/TreeNodeModel.cpp
@@ -649,6 +649,18 @@ VTreeNode* TreeNodeModel::indexToAttrParentOrNode(const QModelIndex & index,bool
     return 0;
 }
 
+VTreeNode* TreeNodeModel::indexToServerOrNode( const QModelIndex & index) const
+{
+    VTreeNode* node=indexToNode(index);
+    if(!node)
+    {
+        if(VTreeServer* ts=indexToServer(index))
+            node=ts->tree();
+    }
+
+    return node;
+}
+
 VTreeNode* TreeNodeModel::indexToNode( const QModelIndex & index) const
 {
 	//If it is not a sever ...
@@ -849,8 +861,10 @@ QModelIndex TreeNodeModel::attributeToIndex(const VAttribute* a, int column) con
     return QModelIndex();
 }
 
+#if 0
 QModelIndex TreeNodeModel::forceShowNode(const VNode* node) const
 {
+    //There is nothing to do when there is no status filter set
     if(data_->isFilterNull())
         return QModelIndex();
 
@@ -887,14 +901,57 @@ QModelIndex TreeNodeModel::forceShowAttribute(const VAttribute* a) const
     return QModelIndex();
 }
 
+#endif
+
+//Sets the object strored in info as the current forceShow object in the
+//data. A forceShow object must always be part of the tree whatever state or
+//atribute filter is set. There can be only one forceShow object at a time in the 
+//whole model/tree.
+void TreeNodeModel::setForceShow(VInfo_ptr info)
+{
+    UI_FUNCTION_LOG
+
+    if(info)
+        UiLog().dbg() << " info=" << info->path();
 
+    //Clear the forceShow object in all the server data objects. Only one of 
+    //these is actually need to clear it.
+    for(int i=0; i < data_->count(); i++)
+    {
+        VTreeServer *ts=data_->server(i)->treeServer();
+        Q_ASSERT(ts);
+        ts->clearForceShow(info->item());
+    }
+    
+    //Sets the forceShow objects in all the server data objects. Only one of these will
+    //actually set the forceShow.
+    for(int i=0; i < data_->count(); i++)
+    {
+        VTreeServer *ts=data_->server(i)->treeServer();
+        Q_ASSERT(ts);
+        ts->setForceShow(info->item());
+    }    
+}
+
+//The selection changed in the view
 void TreeNodeModel::selectionChanged(QModelIndexList lst)
 {
-    if(data_->isFilterNull())
-        return;
+    UI_FUNCTION_LOG
 
-    UiLog().dbg() << "TreeNodeModel::selectionChanged -->";
+    //if(data_->isFilterNull())
+    //    return;
+
+    if(lst.count() > 0)
+    {
+        QModelIndex idx=lst.back();
 
+        VInfo_ptr info=nodeInfo(idx);
+
+        setForceShow(info);
+    }
+        
+
+    #if 0
     Q_FOREACH(QModelIndex idx,lst)
     {
         VInfo_ptr info=nodeInfo(idx);
@@ -905,7 +962,15 @@ void TreeNodeModel::selectionChanged(QModelIndexList lst)
            Q_ASSERT(ts);
            ts->clearForceShow(info->item());
         }
+
+        for(int i=0; i < data_->count(); i++)
+        {
+           VTreeServer *ts=data_->server(i)->treeServer();
+           Q_ASSERT(ts);
+           ts->setForceShow(info->item());
+        }
     }
+    #endif
 }
 
 
@@ -916,7 +981,7 @@ void TreeNodeModel::selectionChanged(QModelIndexList lst)
 
 //WARNING: if we are in the middle of an attribute filter change it will not give
 //correct results, because atts_ contains the new filter state, but the whole VTree still
-//base on the previous atts_ state.!! However we can assume that the index vas visible in
+//base on the previous atts_ state!! However we can assume that the index vas visible in
 //the tree so attrNum() is cached on the tree nodes so we get correct results for nodes.
 //Attributes however cannot be identified correctly.
 
@@ -1170,7 +1235,7 @@ void TreeNodeModel::slotEndServerScan(VModelServer* server,int num)
         Q_EMIT firstScanEnded(ts);
 }
 
-//The server clear has started. It well remove all the nodes except the root node.
+//The server clear has started. It will remove all the nodes except the root node.
 //So we need to remove all the rows belonging to the rootnode.
 void TreeNodeModel::slotBeginServerClear(VModelServer* server,int)
 {
@@ -1292,10 +1357,25 @@ void TreeNodeModel::slotBeginFilterUpdateInsertTop(VTreeServer* server,int row)
     beginInsertRows(idx,attrNum+row,attrNum+row);
 }
 
-void TreeNodeModel::slotEndFilterUpdateInsertTop(VTreeServer* server,int)
+void TreeNodeModel::slotEndFilterUpdateInsertTop(VTreeServer* server,int row)
 {
     Q_ASSERT(server);
     endInsertRows();
+
+    int attrNum=server->tree()->attrNum(atts_);
+    int chNum=server->tree()->numOfChildren();
+
+    Q_ASSERT(chNum >= row);
+    Q_ASSERT(attrNum >=0);
+    Q_ASSERT(chNum >=0);
+
+    if(row >=0)
+    {
+        const VTreeNode* topChange=server->tree()->childAt(row);
+        //when a suite becomes visible we must notify the view about it so that
+        //the expand state could be correctly set!!!
+        Q_EMIT filterUpdateAddEnded(topChange);
+    }
 }
 
 
diff --git a/Viewer/src/TreeNodeModel.hpp b/Viewer/src/TreeNodeModel.hpp
index f80d545..096c605 100644
--- a/Viewer/src/TreeNodeModel.hpp
+++ b/Viewer/src/TreeNodeModel.hpp
@@ -45,15 +45,19 @@ public:
    	QModelIndex index (int, int, const QModelIndex& parent = QModelIndex() ) const;
    	QModelIndex parent (const QModelIndex & ) const;
 
+    QModelIndex serverToIndex(ServerHandler*) const;
+
     QModelIndex nodeToIndex(const VTreeNode*,int column=0) const;
     QModelIndex nodeToIndex(const VNode*,int column=0) const;
     VTreeServer* indexToServer(const QModelIndex & index) const;
     VTreeServer* nameToServer(const std::string&) const;
     VTreeNode* indexToNode( const QModelIndex & index) const;
+    VTreeNode* indexToServerOrNode( const QModelIndex & index) const;
 
     QModelIndex attributeToIndex(const VAttribute* a, int column=0) const;
 
     VInfo_ptr nodeInfo(const QModelIndex& index);
+    void setForceShow(VInfo_ptr);
     void selectionChanged(QModelIndexList lst);
 
     void setEnableServerToolTip(bool st) {serverToolTip_=st;}
@@ -101,9 +105,11 @@ Q_SIGNALS:
     void filterChangeEnded();
     void firstScanEnded(const VTreeServer*);
 
+#if 0
 protected:
     QModelIndex forceShowNode(const VNode* node) const;
     QModelIndex forceShowAttribute(const VAttribute* a) const;
+#endif
 
 private:
     bool isServer(const QModelIndex& index) const;
@@ -111,7 +117,6 @@ private:
 
     ServerHandler* indexToServerHandler(const QModelIndex & index) const;
     QModelIndex serverToIndex(VModelServer* server) const;
-	QModelIndex serverToIndex(ServerHandler*) const;
 
     QModelIndex nodeToIndex(VTreeServer*,const VTreeNode*,int column=0) const;
     VTreeNode* indexToAttrParentNode(const QModelIndex & index) const;
diff --git a/Viewer/src/TreeNodeView.cpp b/Viewer/src/TreeNodeView.cpp
index f402f02..c28ab2b 100644
--- a/Viewer/src/TreeNodeView.cpp
+++ b/Viewer/src/TreeNodeView.cpp
@@ -20,14 +20,18 @@
 #include <QGuiApplication>
 #endif
 
+#include "AbstractNodeView.hpp"
 #include "ActionHandler.hpp"
 #include "Animation.hpp"
 #include "AttributeEditor.hpp"
 #include "ExpandState.hpp"
 #include "TableNodeSortModel.hpp"
 #include "PropertyMapper.hpp"
+#include "StandardView.hpp"
+#include "ServerHandler.hpp"
 #include "TreeNodeModel.hpp"
 #include "TreeNodeViewDelegate.hpp"
+#include "UIDebug.hpp"
 #include "UiLog.hpp"
 #include "VNode.hpp"
 #include "VModelData.hpp"
@@ -35,273 +39,295 @@
 
 #define _UI_TREENODEVIEW_DEBUG
 
-TreeNodeView::TreeNodeView(TreeNodeModel* model,NodeFilterDef* filterDef,QWidget* parent) :
-	QTreeView(parent),
-    NodeViewBase(filterDef),
+TreeNodeView::TreeNodeView(AbstractNodeView* view,TreeNodeModel* model,NodeFilterDef* filterDef,QWidget* parent) :
+    QObject(parent),NodeViewBase(filterDef),
+    view_(view),
     model_(model),
     needItemsLayout_(false),
-	defaultIndentation_(indentation()),
     prop_(NULL),
     setCurrentIsRunning_(false),
-    setCurrentFromExpand_(false)
+    setCurrentFromExpandIsRunning_(false),
+    canRegainCurrentFromExpand_(true),
+    inStartUp_(true)
 {
     setObjectName("view");
     setProperty("style","nodeView");
-	setProperty("view","tree");
+    setProperty("view","tree");
 
-    //expandState_=new ExpandState(this,model_);
-	actionHandler_=new ActionHandler(this);
-
-	//Set the model.
-	setModel(model_);
-
-	//Create delegate to the view
-    delegate_=new TreeNodeViewDelegate(model_,this);
-	setItemDelegate(delegate_);
-
-	connect(delegate_,SIGNAL(sizeHintChangedGlobal()),
-			this,SLOT(slotSizeHintChangedGlobal()));
-
-	//setRootIsDecorated(false);
-	setAllColumnsShowFocus(true);
-	//setUniformRowHeights(true);
-	setMouseTracking(true);
-	setSelectionMode(QAbstractItemView::ExtendedSelection);
-
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
-    header()->setSectionResizeMode(0,QHeaderView::ResizeToContents);
-    header()->setStretchLastSection(false);
-    header()->setMinimumSectionSize(4096);
-#endif
-
-	//!!!!We need to do it because:
-	//The background colour between the view's left border and the nodes cannot be
-	//controlled by delegates or stylesheets. It always takes the QPalette::Highlight
-	//colour from the palette. Here we set this to transparent so that Qt could leave
-	//this area empty and we will fill it appropriately in our delegate.
-	QPalette pal=palette();
-	pal.setColor(QPalette::Highlight,QColor(128,128,128,0));//Qt::transparent);
-	setPalette(pal);
+    //Context menu
+    connect(view_, SIGNAL(customContextMenuRequested(const QPoint &)),
+            this, SLOT(slotContextMenu(const QPoint &)));
 
-	//Hide header
-    setHeaderHidden(true);
-    //header()->hide();
+    //Selection
+    connect(view_,SIGNAL(doubleClicked(const QModelIndex&)),
+            this,SLOT(slotDoubleClickItem(const QModelIndex)));
 
-	//Context menu
-	setContextMenuPolicy(Qt::CustomContextMenu);
+    //Selection
+    connect(view_,SIGNAL(selectionChangedInView(const QItemSelection&, const QItemSelection &)),
+            this,SLOT(selectionChanged(const QItemSelection&, const QItemSelection &)));
 
-	connect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
-		                this, SLOT(slotContextMenu(const QPoint &)));
-
-	//Selection
-	connect(this,SIGNAL(doubleClicked(const QModelIndex&)),
-			this,SLOT(slotDoubleClickItem(const QModelIndex)));
+    //expandState_=new ExpandState(this,model_);
+    actionHandler_=new ActionHandler(this,view_);
 
-	//expandAll();
+    connect(view_->delegate(),SIGNAL(sizeHintChangedGlobal()),
+            this,SLOT(slotSizeHintChangedGlobal()));
 
-	//Properties
-	std::vector<std::string> propVec;
-	propVec.push_back("view.tree.indentation");
+    //Properties
+    std::vector<std::string> propVec;
+    propVec.push_back("view.tree.indentation");
     propVec.push_back("view.tree.background");
     propVec.push_back("view.tree.drawBranchLine");
+    propVec.push_back("view.tree.branchLineColour");
     propVec.push_back("view.tree.serverToolTip");
     propVec.push_back("view.tree.nodeToolTip");
     propVec.push_back("view.tree.attributeToolTip");
-	prop_=new PropertyMapper(propVec,this);
 
-	//Initialise indentation
-    Q_ASSERT(prop_->find("view.tree.indentation"));
-    adjustIndentation(prop_->find("view.tree.indentation")->value().toInt());
+    prop_=new PropertyMapper(propVec,this);
+
+    VProperty *prop=0;
+    std::string propName;
+
+    //Initialise indentation
+    prop=prop_->find("view.tree.indentation",true);
+    adjustIndentation(prop->value().toInt());
 
-    //Init stylesheet related properties
-    Q_ASSERT(prop_->find("view.tree.background"));
-    adjustBackground(prop_->find("view.tree.background")->value().value<QColor>(),false);
-    Q_ASSERT(prop_->find("view.tree.drawBranchLine"));
-    adjustBranchLines(prop_->find("view.tree.drawBranchLine")->value().toBool(),false);
-    adjustStyleSheet();
+    //Init bg colour
+    prop=prop_->find("view.tree.background",true);
+    adjustBackground(prop->value().value<QColor>());
+
+    //Init branch line status (on/off)
+    prop=prop_->find("view.tree.drawBranchLine",true);
+    adjustDrawBranchLine(prop->value().toBool());
+
+    //Init branch line/connector colour
+    prop=prop_->find("view.tree.branchLineColour",true);
+    adjustBranchLineColour(prop->value().value<QColor>());
 
     //Adjust tooltip
-    Q_ASSERT(prop_->find("view.tree.serverToolTip"));
-    adjustServerToolTip(prop_->find("view.tree.serverToolTip")->value().toBool());
+    prop=prop_->find("view.tree.serverToolTip",true);
+    adjustServerToolTip(prop->value().toBool());
 
-    Q_ASSERT(prop_->find("view.tree.nodeToolTip"));
-    adjustNodeToolTip(prop_->find("view.tree.nodeToolTip")->value().toBool());
+    prop=prop_->find("view.tree.nodeToolTip",true);
+    adjustNodeToolTip(prop->value().toBool());
 
-    Q_ASSERT(prop_->find("view.tree.attributeToolTip"));
-    adjustAttributeToolTip(prop_->find("view.tree.attributeToolTip")->value().toBool());
-}
+    prop=prop_->find("view.tree.attributeToolTip",true);
+    adjustAttributeToolTip(prop->value().toBool());
 
-TreeNodeView::~TreeNodeView()
-{
-    qDeleteAll(expandStates_);
-	delete actionHandler_;
-	delete prop_;
+    inStartUp_=false;
 }
 
-#if 0
-void TreeNodeView::setModel(NodeFilterModel *model)
+TreeNodeView::~TreeNodeView()
 {
-	model_= model;
-
-	//Set the model.
-	QTreeView::setModel(model_);
+    delete actionHandler_;
+    delete prop_;
 }
-#endif
 
 QWidget* TreeNodeView::realWidget()
 {
-	return this;
+    return view_;
 }
 
-void TreeNodeView::resizeEvent(QResizeEvent* e)
+QObject* TreeNodeView::realObject()
 {
-    QTreeView::resizeEvent(e);
-    //resizeColumnToContents(0);
+    return this;
 }
 
-//Collects the selected list of indexes
+//Collect the selected list of indexes
 QModelIndexList TreeNodeView::selectedList()
 {
-  	QModelIndexList lst;
-  	Q_FOREACH(QModelIndex idx,selectedIndexes())
-	  	if(idx.column() == 0)
-		  	lst << idx;
-	return lst;
+    QModelIndexList lst;
+    Q_FOREACH(QModelIndex idx,view_->selectedIndexes())
+        if(idx.column() == 0)
+            lst << idx;
+    return lst;
 }
 
-// reimplement virtual function from QTreeView - called when the selection is changed
+// This slot is called when the selection changed in the view 
 void TreeNodeView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
 {
-    QModelIndexList lst=selectedIndexes();
-    //When the selection was triggered from restoring (expanding) the nodes
+#ifdef _UI_TREENODEVIEW_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    QModelIndexList lst=view_->selectedIndexes();
+
+    //When the selection was triggered from restoring the expand state of the tree
     //we do not want to broadcast it
-    if(lst.count() > 0 && !setCurrentFromExpand_)
-    {            
-        VInfo_ptr info=model_->nodeInfo(lst.front());
+    if(lst.count() > 0 && !setCurrentFromExpandIsRunning_)
+    {
+        VInfo_ptr info=model_->nodeInfo(lst.back());
         if(info && !info->isEmpty())
         {
 #ifdef _UI_TREENODEVIEW_DEBUG
-            UiLog().dbg() << "TreeNodeView::selectionChanged --> emit=" << info->path();
+            UiLog().dbg() << " emit=" << info->path();
 #endif
             Q_EMIT selectionChanged(info);
         }
+        //Remembers the current selection
         lastSelection_=info;
     }
 
-    QTreeView::selectionChanged(selected, deselected);
 
     //The model has to know about the selection in order to manage the
-    //nodes that are forced to be shown
-    model_->selectionChanged(lst);
+    //nodes that are forced to be shown. We only do it when we are not in the the middle of
+    // "setCurrentSelection()" call because that handles the forceShow independently.
+    if(!setCurrentIsRunning_)
+        model_->selectionChanged(lst);
 }
 
+//Returns the current selection (the last one!)
 VInfo_ptr TreeNodeView::currentSelection()
 {
-	QModelIndexList lst=selectedIndexes();
-	if(lst.count() > 0)
-	{
-		return model_->nodeInfo(lst.front());
-	}
-	return VInfo_ptr();
+    QModelIndexList lst=view_->selectedIndexes();
+    if(lst.count() > 0)
+    {
+        return model_->nodeInfo(lst.back());
+    }
+    return VInfo_ptr();
 }
 
+//Sets the current selection to the given VInfo item.
+// called:
+//  -from outside of the view when the selection is broadcast from another view
+//  -from within the view when the tree expand state was restored
 void TreeNodeView::setCurrentSelection(VInfo_ptr info)
 {
-    //While the current is being selected we do not allow
-    //another setCurrent call go through
+#ifdef _UI_TREENODEVIEW_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    //We cannot call it recursively
+    Q_ASSERT(setCurrentIsRunning_ == false);
+
+    //While the current item  is being selected we do not allow
+    //another setCurrent call to go through
     if(!info || setCurrentIsRunning_)
         return;
 
+    //Indicate that setCurrent started
     setCurrentIsRunning_=true;
-    QModelIndex idx=model_->infoToIndex(info);
-	if(idx.isValid())
-	{          
+
 #ifdef _UI_TREENODEVIEW_DEBUG
-        UiLog().dbg() << "TreeNodeView::setCurrentSelection --> " << info->path();
+    UiLog().dbg() << " info=" << info->path();
 #endif
-        setCurrentIndex(idx);
-	}
-    else
+
+    //Forcing an object to be shown can result in altering and relayouting the tree. We
+    //have to block the regaining of the selection at the end of the layout
+    //process when the tree expand state is restored.
+    canRegainCurrentFromExpand_=false;
+
+    //Force the object to be shown in the tree
+    model_->setForceShow(info);
+
+    //Lookup the object in the model
+    QModelIndex idx=model_->infoToIndex(info);
+
+    //Get the index again if it is needed
+    //if(!idx.isValid())
+    //{
+    //    idx=model_->infoToIndex(info);
+    //}
+
+    //The re-layouting finished. We do not need to block the regaining of selection when
+    //the tree expand state is restored.
+    canRegainCurrentFromExpand_=true;
+
+    //If the item is in the model we set it as current
+    if(idx.isValid())
     {
-        lastSelection_.reset();
+        view_->setCurrentIndex(idx); //this will call selectionChanged
+        view_->scrollTo(idx);
     }
+
+    //Indicate that the set current process finished
     setCurrentIsRunning_=false;
 }
 
+//Sets the current selection to the given VInfo item
+//when the tree expand state is restored
 void TreeNodeView::setCurrentSelectionFromExpand(VInfo_ptr info)
 {
-    if(!info || setCurrentFromExpand_)
+#ifdef _UI_TREENODEVIEW_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    if(!info || setCurrentFromExpandIsRunning_)
         return;
 
 #ifdef _UI_TREENODEVIEW_DEBUG
-        UiLog().dbg() << "TreeNodeView::setCurrentSelectionFromExpand --> " << info->path();
+        UiLog().dbg() << " info=" << info->path();
 #endif
 
-    setCurrentFromExpand_=true;
+    setCurrentFromExpandIsRunning_=true;
     setCurrentSelection(info);
-    setCurrentFromExpand_=false;
+    setCurrentFromExpandIsRunning_=false;
 }
 
+//Selects the first server in the view
 void TreeNodeView::selectFirstServer()
 {
-	QModelIndex idx=model_->index(0,0);
-	if(idx.isValid())
-	{      
-        setCurrentIndex(idx);
-		VInfo_ptr info=model_->nodeInfo(idx);
-		Q_EMIT selectionChanged(info);
-	}
-}
-
-
-void TreeNodeView::slotDoubleClickItem(const QModelIndex& idx)
-{
-    VInfo_ptr info=model_->nodeInfo(idx);
-    if(info && info->isAttribute())
+    QModelIndex idx=model_->index(0,0);
+    if(idx.isValid())
     {
-        slotViewCommand(info,"edit");
+        view_->setCurrentIndex(idx);
+        VInfo_ptr info=model_->nodeInfo(idx);
+        Q_EMIT selectionChanged(info);
     }
 }
 
 void TreeNodeView::slotContextMenu(const QPoint &position)
 {
-	QModelIndexList lst=selectedList();
-	//QModelIndex index=indexAt(position);
-	QPoint scrollOffset(horizontalScrollBar()->value(),verticalScrollBar()->value());
+#ifdef _UI_TREENODEVIEW_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    QModelIndex indexClicked=view_->indexAt(position);
+    QModelIndexList indexSel=selectedList();
+    if(!indexSel.contains(indexClicked))
+    {
+        indexSel.clear();
+        indexSel << indexClicked;
+    }
 
-	handleContextMenu(indexAt(position),lst,mapToGlobal(position),position+scrollOffset,this);
+    QPoint scrollOffset(view_->horizontalScrollBar()->value(),view_->verticalScrollBar()->value());
+    handleContextMenu(indexClicked,indexSel,view_->mapToGlobal(position),position+scrollOffset,view_);
 }
 
-
 void TreeNodeView::handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget)
 {
-  	//Node actions
-  	if(indexClicked.isValid() && indexClicked.column() == 0)   //indexLst[0].isValid() && indexLst[0].column() == 0)
-	{    
-  		std::vector<VInfo_ptr> nodeLst;
-		for(int i=0; i < indexLst.count(); i++)
-		{
-			VInfo_ptr info=model_->nodeInfo(indexLst[i]);
-			if(info && !info->isEmpty())
-				nodeLst.push_back(info);
-		}
+    //Node actions
+    if(indexClicked.isValid() && indexClicked.column() == 0)   //indexLst[0].isValid() && indexLst[0].column() == 0)
+    {       
+        std::vector<VInfo_ptr> nodeLst;
+        for(int i=0; i < indexLst.count(); i++)
+        {
+            VInfo_ptr info=model_->nodeInfo(indexLst[i]);
+            if(info && !info->isEmpty())
+                nodeLst.push_back(info);
+        }
 
-		actionHandler_->contextMenu(nodeLst,globalPos);
-	}
+        actionHandler_->contextMenu(nodeLst,globalPos);
+    }
 
-	//Desktop actions
-	else
-	{
-	}
+    //Desktop actions
+    else
+    {
+    }
+}
+
+void TreeNodeView::slotDoubleClickItem(const QModelIndex& idx)
+{
+    VInfo_ptr info=model_->nodeInfo(idx);
+    if(info && info->isAttribute())
+    {
+        slotViewCommand(info,"edit");
+    }
 }
 
 void TreeNodeView::slotViewCommand(VInfo_ptr info,QString cmd)
 {
-	if(cmd == "expand")
-	{
-		QModelIndex idx=model_->infoToIndex(info);
-		if(idx.isValid())
-		{
+    //Expand all the children of the given node
+    if(cmd == "expand")
+    {
+        QModelIndex idx=model_->infoToIndex(info);
+        if(idx.isValid())
+        {
 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
             QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
 #endif
@@ -309,201 +335,108 @@ void TreeNodeView::slotViewCommand(VInfo_ptr info,QString cmd)
             QTime t;
             t.start();
 #endif
-            expandAll(idx);
+            //apply expand in the view
+            view_->expandAll(idx);
 #ifdef _UI_TREENODEVIEW_DEBUG
             UiLog().dbg() << "expandAll time=" << t.elapsed()/1000. << "s";
 #endif
 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
             QGuiApplication::restoreOverrideCursor();
+
+            //save/update the expand state object
+            saveExpandAll(idx);
+
 #endif
+        }
+    }
+    else if(cmd == "collapse")
+    {
+        QModelIndex idx=model_->infoToIndex(info);
+        if(idx.isValid())
+        {
+            //apply expand in the view
+            view_->collapseAll(idx);
 
-		}
-	}
-	else if(cmd == "collapse")
-	{
-		QModelIndex idx=model_->infoToIndex(info);
-		if(idx.isValid())
-		{
-            collapseAll(idx);
-		}
-	}
+            //save/update the expand state object
+            saveCollapseAll(idx);
+        }
+    }
 
     else if(cmd ==  "edit")
     {
         if(info && info->isAttribute())
         {
-            AttributeEditor::edit(info,this);
+            AttributeEditor::edit(info,view_);
+        }
+    }
+
+    //Only filter the given suite (of the node stored in info).
+    //We achive this by setting the suitefilter to filter only this
+    //suite.
+    else if(cmd ==  "filterOne")
+    {
+        if(info)
+        {
+            if(ServerHandler* server=info->server())
+            {
+                VNode* n=info->node();
+                if(n && info->isNode())
+                    server->setSuiteFilterWithOne(n);
+            }
         }
     }
 
-	/*if(cmd == "set_as_root")
-	{
-		model_->setRootNode(nodeLst.at(0)->node());
-		expandAll();
-	}*/
+    /*if(cmd == "set_as_root")
+    {
+        model_->setRootNode(nodeLst.at(0)->node());
+        expandAll();
+    }*/
 }
 
 void TreeNodeView::reload()
 {
-	//model_->reload();
-	//expandAll();
+    //model_->reload();
+    //expandAll();
 }
 
 void TreeNodeView::rerender()
 {
-	if(needItemsLayout_)
-	{
-		doItemsLayout();
-		needItemsLayout_=false;
-	}
-	else
-	{
-		viewport()->update();
-	}
+    if(needItemsLayout_)
+    {
+        view_->doItemsLayout();
+        needItemsLayout_=false;
+    }
+    else
+    {
+        view_->viewport()->update();
+    }
 }
 
 void TreeNodeView::slotRerender()
 {
-	rerender();
+    rerender();
 }
 
 void TreeNodeView::slotRepaint(Animation* an)
 {
-	if(!an)
-		return;
+    if(!an)
+        return;
 
     Q_FOREACH(VNode* n,an->targets())
-	{
-        update(model_->nodeToIndex(n));
-	}
-}
-
-void TreeNodeView::slotSizeHintChangedGlobal()
-{
-	needItemsLayout_=true;
-}
-
-void TreeNodeView::adjustStyleSheet()
-{
-    QString sh;
-    if(styleSheet_.contains("bg"))
-       sh+=styleSheet_["bg"];
-    if(styleSheet_.contains("branch"))
-       sh+=styleSheet_["branch"];
-
-    setStyleSheet(sh);
-}
-
-void TreeNodeView::adjustIndentation(int offset)
-{
-	if(offset >=0)
-	{
-		setIndentation(defaultIndentation_+offset);
-		delegate_->setIndentation(indentation());
-	}
-}
-
-void TreeNodeView::adjustBackground(QColor col,bool adjust)
-{
-	if(col.isValid())
-	{       
-        styleSheet_["bg"]="QTreeView { background : " + col.name() + ";}";
-
-        if(adjust)
-            adjustStyleSheet();
-	}
-}
-
-void TreeNodeView::adjustBranchLines(bool st,bool adjust)
-{
-    if(styleSheet_.contains("branch"))
     {
-        bool oriSt=styleSheet_["branch"].contains("url(:");
-        if(oriSt == st)
-            return;
+        view_->update(model_->nodeToIndex(n));
     }
-
-    QString vline((st)?"url(:/viewer/tree_vline.png) 0":"none");
-    QString bmore((st)?"url(:/viewer/tree_branch_more.png) 0":"none");
-    QString bend((st)?"url(:/viewer/tree_branch_end.png) 0":"none");
-
-    styleSheet_["branch"]="QTreeView::branch:has-siblings:!adjoins-item { border-image: " + vline + ";}" \
-     "QTreeView::branch:!has-children:has-siblings:adjoins-item {border-image: " +  bmore + ";}" \
-     "QTreeView::branch:!has-children:!has-siblings:adjoins-item {border-image: " + bend + ";}";
-
-    if(adjust)
-        adjustStyleSheet();
 }
 
-void TreeNodeView::adjustServerToolTip(bool st)
-{
-    model_->setEnableServerToolTip(st);
-}
-
-void TreeNodeView::adjustNodeToolTip(bool st)
-{
-    model_->setEnableNodeToolTip(st);
-}
-
-void TreeNodeView::adjustAttributeToolTip(bool st)
+void TreeNodeView::slotSizeHintChangedGlobal()
 {
-    model_->setEnableAttributeToolTip(st);
-}
-
-void TreeNodeView::notifyChange(VProperty* p)
-{
-	if(p->path() == "view.tree.indentation")
-    {
-		adjustIndentation(p->value().toInt());
-    }
-	else if(p->path() == "view.tree.background")
-	{
-		adjustBackground(p->value().value<QColor>());
-    }
-    else if(p->path() == "view.tree.drawBranchLine")
-    {
-        adjustBranchLines(p->value().toBool());
-    }
-    else if(p->path() == "view.tree.serverToolTip")
-    {
-        adjustServerToolTip(p->value().toBool());
-    }
-    else if(p->path() == "view.tree.nodeToolTip")
-    {
-        adjustNodeToolTip(p->value().toBool());
-    }
-    else if(p->path() == "view.tree.attributeToolTip")
-    {
-        adjustAttributeToolTip(p->value().toBool());
-    }
+    needItemsLayout_=true;
 }
 
 //====================================================
 // Expand state management
 //====================================================
 
-void TreeNodeView::expandAll(const QModelIndex& idx)
-{
-	expand(idx);
-
-	for(int i=0; i < model_->rowCount(idx); i++)
-	{
-		QModelIndex chIdx=model_->index(i, 0, idx);
-		expandAll(chIdx);
-	}
-}
-
-void TreeNodeView::collapseAll(const QModelIndex& idx)
-{
-	collapse(idx);
-
-	for(int i=0; i < model_->rowCount(idx); i++)
-	{
-		QModelIndex chIdx=model_->index(i, 0, idx);
-		collapseAll(chIdx);
-	}
-}
-
 void TreeNodeView::expandTo(const QModelIndex& idxTo)
 {
     QModelIndex idx=model_->parent(idxTo);
@@ -517,80 +450,186 @@ void TreeNodeView::expandTo(const QModelIndex& idxTo)
 
     Q_FOREACH(QModelIndex d,lst)
     {
-        expand(d);
+        view_->expand(d);       
     }
 }
 
+#if 0
 //Save all
 void TreeNodeView::slotSaveExpand()
 {
+    //For each server we save the expand state
     for(int i=0; i < model_->rowCount(); i++)
     {
         QModelIndex serverIdx=model_->index(i, 0);
         VTreeServer* ts=model_->indexToServer(serverIdx);
         Q_ASSERT(ts);
 
-        TreeViewExpandState* es=new TreeViewExpandState(this,model_);
-        expandStates_ << es;
-        es->save(ts->tree());
+        //The expand state is stored on the VTreeServer and must survive updates and refreshes!
+        ExpandState* es=ts->expandState();
+        if(!es)
+        {
+            es=new ExpandState(view_,model_);
+            ts->setExpandState(es); //the treeserver takes ownership of the expandstate
+        }
 
-        //ExpandStateTree* es=expandState_->add();
-        //es->save(ts->tree());
+        //Save the current state
+        Q_ASSERT(ts->tree());
+        VNode* vnode=ts->tree()->vnode();
+        Q_ASSERT(vnode);
+        es->save(vnode);
     }
 }
 
 void TreeNodeView::slotRestoreExpand()
-{
-    Q_FOREACH(TreeViewExpandState* es,expandStates_)
+{    
+    //For each server we restore the expand state
+    for(int i=0; i < model_->rowCount(); i++)
     {
-        if(es->root())
+        QModelIndex serverIdx=model_->index(i, 0);
+        VTreeServer* ts=model_->indexToServer(serverIdx);
+        Q_ASSERT(ts);
+
+        //The expand state is stored on the VTreeServer
+        ExpandState* es=ts->expandState();
+        if(es)
         {
-            VTreeServer* ts=model_->nameToServer(es->root()->name_);
-            if(ts)
-            {
-                es->restore(ts->tree());
-            }
+            Q_ASSERT(ts->tree());
+            VNode* vnode=ts->tree()->vnode();
+            Q_ASSERT(vnode);
+
+            bool expanded=view_->isExpanded(serverIdx);
+            view_->collapse(serverIdx);
+            es->collectExpanded(vnode,view_->expandedIndexes);
+            if(expanded)
+                view_->expand(serverIdx);
         }
     }
-
-    qDeleteAll(expandStates_);
-    expandStates_.clear();
     regainSelectionFromExpand();
+
 }
+#endif
 
 //Save the expand state for the given node (it can be a server as well)
 void TreeNodeView::slotSaveExpand(const VTreeNode* node)
 {
-    TreeViewExpandState* es=new TreeViewExpandState(this,model_);
-    expandStates_ << es;
-    es->save(node);
+    UI_FUNCTION_LOG
+    Q_ASSERT(node);
+    VTreeServer* ts=node->server();
+    Q_ASSERT(ts);
+
+#ifdef _UI_TREENODEVIEW_DEBUG
+    UiLog().dbg() << " node=" << node->vnode()->fullPath();
+#endif
 
-    //TreeViewExpandState* es=expandState_->add();
-    //es->save(node);
+    ExpandState* es=ts->expandState();
+    if(!es)
+    {
+        es=new ExpandState(view_,model_);
+        ts->setExpandState(es); //the treeserver takes ownership of the expandstate
+    }
+
+    Q_ASSERT(es);
+
+    //Save the current state
+    es->save(node->vnode());
+
+    //es->print();
 }
 
 //Restore the expand state for the given node (it can be a server as well)
 void TreeNodeView::slotRestoreExpand(const VTreeNode* node)
 {
-    for(int i=0; i < expandStates_.count(); i++)
+    UI_FUNCTION_LOG
+    Q_ASSERT(node);
+    VTreeServer* ts=node->server();
+    Q_ASSERT(ts);
+
+#ifdef _UI_TREENODEVIEW_DEBUG
+    UiLog().dbg() << " node=" << node->vnode()->fullPath();
+#endif
+
+    if(ExpandState* es=ts->expandState())
     {
-        TreeViewExpandState* es=expandStates_[i];
-        {
-            if(es->rootSameAs(node->vnode()->strName()))
-            {
-                es->restore(node);
-                expandStates_.remove(i);
-                delete es;
-                break;
-            }
+        QModelIndex idx=model_->nodeToIndex(node);
+        if(idx.isValid())
+        {            
+            bool expandedOri=view_->isExpanded(idx);
+            view_->collapse(idx);
+            es->collectExpanded(node->vnode(),view_->expandedIndexes);
+#ifdef _UI_TREENODEVIEW_DEBUG
+            UiLog().dbg() << " expanded=" << view_->isExpanded(idx);
+#endif
+            if(expandedOri || view_->isExpanded(idx))
+                view_->expand(idx);
         }
+
+        //es->print();
     }
 
-    regainSelectionFromExpand();
+    if(canRegainCurrentFromExpand_)
+        regainSelectionFromExpand();
+}
+
+void TreeNodeView::saveExpandAll(const QModelIndex& idx)
+{
+    if(!idx.isValid())
+        return;
+
+    VTreeNode* tnode=model_->indexToServerOrNode(idx);
+    Q_ASSERT(tnode);
+    VTreeServer* ts=tnode->server();
+    Q_ASSERT(ts);
+    Q_ASSERT(ts->tree());
+    VNode* vnode=ts->tree()->vnode();
+    Q_ASSERT(vnode);
+
+    //The expand state is stored on the VTreeServer
+    ExpandState* es=ts->expandState();
+    if(!es)
+    {
+        es=new ExpandState(view_,model_);
+        ts->setExpandState(es); //the treeserver takes ownership of the expandstate
+    }
+    if(es->isEmpty())
+    {      
+        es->save(vnode);
+    }
+    es->saveExpandAll(vnode);
 }
 
+void TreeNodeView::saveCollapseAll(const QModelIndex& idx)
+{
+    if(!idx.isValid())
+        return;
+
+    VTreeNode* tnode=model_->indexToServerOrNode(idx);
+    Q_ASSERT(tnode);
+    VTreeServer* ts=tnode->server();
+    Q_ASSERT(ts);
+    Q_ASSERT(ts->tree());
+    VNode* vnode=ts->tree()->vnode();
+    Q_ASSERT(vnode);
+
+    //The expand state is stored on the VTreeServer
+    ExpandState* es=ts->expandState();
+    if(!es)
+    {
+        es=new ExpandState(view_,model_);
+        ts->setExpandState(es); //the treeserver takes ownership of the expandstate
+    }
+    if(es->isEmpty())
+    {     
+        es->save(vnode);
+    }
+    es->saveCollapseAll(vnode);
+}
+
+
 void TreeNodeView::regainSelectionFromExpand()
 {
+    Q_ASSERT(canRegainCurrentFromExpand_ == true);
+
     VInfo_ptr s=currentSelection();
     if(!s)
     {
@@ -608,3 +647,89 @@ void TreeNodeView::regainSelectionFromExpand()
         }
     }
 }
+
+//==============================================
+// Property handling
+//==============================================
+
+void TreeNodeView::adjustIndentation(int indent)
+{
+    if(indent >=0)
+    {
+        view_->setIndentation(indent);
+        needItemsLayout_=true;
+    }
+}
+
+void TreeNodeView::adjustBackground(QColor col)
+{
+    if(col.isValid())
+    {
+        QPalette p=view_->viewport()->palette();
+        p.setColor(QPalette::Window,col);
+        view_->viewport()->setPalette(p);
+
+        //When we set the palette on startup something resets the palette
+        //before the first paint event happens. So we set the expected bg colour
+        //so that the view should know what bg colour it should use.
+        if(inStartUp_)
+            view_->setExpectedBg(col);
+    }
+}
+
+void TreeNodeView::adjustDrawBranchLine(bool b)
+{
+    view_->setDrawConnector(b);
+}
+
+void TreeNodeView::adjustBranchLineColour(QColor col)
+{
+    view_->setConnectorColour(col);
+}
+
+void TreeNodeView::adjustServerToolTip(bool st)
+{
+    model_->setEnableServerToolTip(st);
+}
+
+void TreeNodeView::adjustNodeToolTip(bool st)
+{
+    model_->setEnableNodeToolTip(st);
+}
+
+void TreeNodeView::adjustAttributeToolTip(bool st)
+{
+    model_->setEnableAttributeToolTip(st);
+}
+
+void TreeNodeView::notifyChange(VProperty* p)
+{
+    if(p->path() == "view.tree.background")
+    {
+        adjustBackground(p->value().value<QColor>());
+    }
+    else if(p->path() == "view.tree.indentation")
+    {
+        adjustIndentation(p->value().toInt());
+    }
+    else if(p->path() == "view.tree.drawBranchLine")
+    {
+        adjustDrawBranchLine(p->value().toBool());
+    }
+    else if(p->path() == "view.tree.branchLineColour")
+    {
+        adjustBranchLineColour(p->value().value<QColor>());
+    }
+    else if(p->path() == "view.tree.serverToolTip")
+    {
+        adjustServerToolTip(p->value().toBool());
+    }
+    else if(p->path() == "view.tree.nodeToolTip")
+    {
+        adjustNodeToolTip(p->value().toBool());
+    }
+    else if(p->path() == "view.tree.attributeToolTip")
+    {
+        adjustAttributeToolTip(p->value().toBool());
+    }
+}
diff --git a/Viewer/src/TreeNodeView.hpp b/Viewer/src/TreeNodeView.hpp
index 6f883cd..e6d16c0 100644
--- a/Viewer/src/TreeNodeView.hpp
+++ b/Viewer/src/TreeNodeView.hpp
@@ -15,97 +15,94 @@
 
 #include "NodeViewBase.hpp"
 
-#include "ExpandState.hpp"
 #include "VInfo.hpp"
 #include "VProperty.hpp"
 
+class AbstractNodeView;
 class ActionHandler;
 class Animation;
 class ExpandNode;
 class TableNodeSortModel;
 class PropertyMapper;
 class TreeNodeModel;
-class TreeNodeViewDelegate;
-//class TreeViewExpandState;
+class StandardNodeViewDelegategate;
 class VTreeNode;
 
-//class TreeNodeView;
-//typedef ExpandState<TreeNodeView> TreeViewExpandState;
-
-class TreeNodeView : public QTreeView, public NodeViewBase, public VPropertyObserver
+class TreeNodeView : public QObject, public NodeViewBase, public VPropertyObserver
 {
 Q_OBJECT
 
 public:
-    explicit TreeNodeView(TreeNodeModel* model,NodeFilterDef* filterDef,QWidget *parent=0);
-	~TreeNodeView();
+    TreeNodeView(AbstractNodeView* view,TreeNodeModel* model,NodeFilterDef* filterDef,QWidget *parent=0);
+    ~TreeNodeView();
 
-	void reload();
-	void rerender();
-	QWidget* realWidget();
+    void reload();
+    void rerender();
+    QWidget* realWidget();
+    QObject* realObject();
     VInfo_ptr currentSelection();
     void setCurrentSelection(VInfo_ptr n);
-	void selectFirstServer();
-#if 0
-    void setModel(NodeFilterModel* model);
-#endif
-	void notifyChange(VProperty* p);
+    void selectFirstServer();
+
+    void notifyChange(VProperty* p);
 
     void readSettings(VSettings* vs) {}
     void writeSettings(VSettings* vs) {}
 
 public Q_SLOTS:
-	void slotDoubleClickItem(const QModelIndex&);
-	void slotContextMenu(const QPoint &position);
-	void slotViewCommand(VInfo_ptr,QString);
+    void slotContextMenu(const QPoint &position);
+    void slotViewCommand(VInfo_ptr,QString);
+#if 0
     void slotSaveExpand();
     void slotRestoreExpand();
+#endif
     void slotSaveExpand(const VTreeNode* node);
     void slotRestoreExpand(const VTreeNode* node);
-	void slotRepaint(Animation*);
-	void slotRerender();
-	void slotSizeHintChangedGlobal();
+    void slotRepaint(Animation*);
+    void slotRerender();
+    void slotSizeHintChangedGlobal();
 
 protected Q_SLOTS:
+    void slotDoubleClickItem(const QModelIndex&);
     void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
 
 Q_SIGNALS:
-	void selectionChanged(VInfo_ptr);
-	void infoPanelCommand(VInfo_ptr,QString);
-	void dashboardCommand(VInfo_ptr,QString);
+    void selectionChanged(VInfo_ptr);
+    void infoPanelCommand(VInfo_ptr,QString);
+    void dashboardCommand(VInfo_ptr,QString);
 
 protected:
-    void resizeEvent(QResizeEvent*);
     QModelIndexList selectedList();
-	void handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget);
-
-	void adjustIndentation(int);
-    void adjustBackground(QColor col,bool asjustStyleSheet=true);
-    void adjustBranchLines(bool,bool asjustStyleSheet=true);
-    void adjustStyleSheet();
-    void adjustServerToolTip(bool);
-    void adjustNodeToolTip(bool);
-    void adjustAttributeToolTip(bool);
+    void handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget);
 
-    void expandAll(const QModelIndex& idx);
-	void collapseAll(const QModelIndex& idx);
+    void saveExpand(ExpandNode *parentExpand,const QModelIndex& idx);
+    void restoreExpand(ExpandNode *expand,const VNode* node);
     void expandTo(const QModelIndex& idxTo);
+    void saveExpandAll(const QModelIndex& idx);
+    void saveCollapseAll(const QModelIndex& idx);
+
     void setCurrentSelectionFromExpand(VInfo_ptr info);
     void regainSelectionFromExpand();
 
+    void adjustBackground(QColor col);
+    void adjustIndentation(int);
+    void adjustDrawBranchLine(bool b);
+    void adjustBranchLineColour(QColor col);
+    void adjustServerToolTip(bool);
+    void adjustNodeToolTip(bool);
+    void adjustAttributeToolTip(bool);
+
+    AbstractNodeView *view_;
     TreeNodeModel* model_;
-	ActionHandler* actionHandler_;
+    ActionHandler* actionHandler_;
     bool needItemsLayout_;
-	int defaultIndentation_;
-	TreeNodeViewDelegate* delegate_;
-	PropertyMapper* prop_;
+    PropertyMapper* prop_;
     QMap<QString,QString> styleSheet_;
     bool setCurrentIsRunning_;
-    bool setCurrentFromExpand_;
+    bool setCurrentFromExpandIsRunning_;
+    bool canRegainCurrentFromExpand_;
     VInfo_ptr lastSelection_;
-
-    typedef ExpandState<TreeNodeView> TreeViewExpandState;
-    QVector<TreeViewExpandState*> expandStates_;
+    bool inStartUp_;
 };
 
 #endif
diff --git a/Viewer/src/TreeNodeViewDelegate.cpp b/Viewer/src/TreeNodeViewDelegate.cpp
index df6372b..13c54b1 100644
--- a/Viewer/src/TreeNodeViewDelegate.cpp
+++ b/Viewer/src/TreeNodeViewDelegate.cpp
@@ -19,49 +19,213 @@
 #include "Animation.hpp"
 #include "FontMetrics.hpp"
 #include "IconProvider.hpp"
+#include "Palette.hpp"
 #include "PropertyMapper.hpp"
 #include "ServerHandler.hpp"
+#include "TreeNodeModel.hpp"
 #include "UiLog.hpp"
 
-#if 0
 static std::vector<std::string> propVec;
 
 static QColor typeFgColourClassic=QColor(Qt::white);
 static QColor typeBgColourClassic=QColor(150,150,150);
 static QColor childCountColour=QColor(90,91,92);
-#endif
 
-struct TreeNodeDelegateBox : public NodeDelegateBox
-{
-    TreeNodeDelegateBox() {
-        topMargin=2;
-        bottomMargin=2;
-        leftMargin=8;
-        rightMargin=2;
-        topPadding=0;
-        bottomPadding=0;
-        leftPadding=2;
-        rightPadding=2;
-      }
+
+struct NodeShape
+{
+    QColor col_;
+    QPolygon shape_;
 };
 
-struct TreeAttrDelegateBox : public AttrDelegateBox
-{
-    TreeAttrDelegateBox() {
-        topMargin=2;
-        bottomMargin=2;
-        leftMargin=8;
-        rightMargin=2;
-        topPadding=0;
-        bottomPadding=0;
-        leftPadding=2;
-        rightPadding=0;
-      }
+struct NodeText
+{
+    QColor fgCol_;
+    QColor bgCol_;
+    QRect br_;
+    QString text_;
 };
 
+struct ServerUpdateData
+{
+    QRect br_;
+    int prevTime_;
+    int nextTime_;
+    QString prevText_;
+    QString nextText_;
+    float prog_;
+};
+
+
+class TreeNodeDelegateBox : public NodeDelegateBox
+{
+public:
+
+    TreeNodeDelegateBox() : textTopCorrection(0), textBottomCorrection(0)
+     {
+         topMargin=2;
+         bottomMargin=2;
+         leftMargin=1;
+         rightMargin=2;
+         topPadding=0;
+         bottomPadding=0;
+         leftPadding=2;
+         rightPadding=2;
+     }
+
+     int realFontHeight;
+     int textTopCorrection;
+     int textBottomCorrection;
+
+     void adjust(const QFont& f)
+     {
+         FontMetrics fm(f);
+         realFontHeight=fm.realHeight();
+         textTopCorrection=fm.topPaddingForCentre();
+         textBottomCorrection=fm.bottomPaddingForCentre();
+         fontHeight=fm.height();
+
+         if(textTopCorrection > 1)
+         {
+             textTopCorrection-=2;
+             realFontHeight+=2;
+         }
+
+         height=realFontHeight+topPadding+bottomPadding;
+         fullHeight=height+topMargin+bottomMargin;
+         sizeHintCache=QSize(100,fullHeight);
+         spacing=fm.width('A')*3/4;
+
+         int h=static_cast<int>(static_cast<float>(fm.height())*0.7);
+         iconSize=h;
+         if(iconSize % 2 == 1)
+             iconSize+=1;
+
+         iconGap=1;
+         if(iconSize > 16)
+             iconGap=2;
+
+         iconPreGap=fm.width('A')/2;
+     }
+
+     QRect adjustTextRect(const QRect& rIn) const
+     {
+         //Q_ASSERT(rIn.height() == fontHeight);
+         QRect r=rIn;
+         r.setY(r.y()-textTopCorrection);
+         r.setHeight(fontHeight);
+         return r;
+     }
+
+     QRect adjustSelectionRect(const QRect& optRect) const {
+         QRect r=optRect;
+         return r;
+     }
+};
+
+class TreeAttrDelegateBox : public AttrDelegateBox
+{
+public:
+    TreeAttrDelegateBox() : textTopCorrection(0), textBottomCorrection(0)
+     {
+         topMargin=2;
+         bottomMargin=2;
+         leftMargin=1;
+         rightMargin=2;
+         topPadding=0;
+         bottomPadding=0;
+         leftPadding=1;
+         rightPadding=2;
+     }
+
+     int realFontHeight;
+     int textTopCorrection;
+     int textBottomCorrection;
+
+     void adjust(const QFont& f)
+     {
+         FontMetrics fm(f);
+         realFontHeight=fm.realHeight();
+         textTopCorrection=fm.topPaddingForCentre();
+         textBottomCorrection=fm.bottomPaddingForCentre();
+         fontHeight=fm.height();
+
+         height=realFontHeight+topPadding+bottomPadding;
+         fullHeight=height+topMargin+bottomMargin;
+         sizeHintCache=QSize(100,fullHeight);
+         spacing=fm.width('A')*3/4;
+     }
+
+     QRect adjustTextRect(const QRect& rIn) const
+     {
+         QRect r=rIn;
+         r.setY(r.y()-textTopCorrection+1);
+         r.setHeight(fontHeight);
+         return r;
+     }
+
+     QRect adjustTextBgRect(const QRect& rIn) const
+     {
+         QRect r=rIn;
+         return r.adjusted(0,-1,0,1);
+     }
+
+     QRect adjustSelectionRect(const QRect& optRect) const {
+         QRect r=optRect;
+         return r.adjusted(0,-selectRm.topOffset(),0,-selectRm.bottomOffset());
+     }
+
+     QRect adjustSelectionRectNonOpt(const QRect& optRect) const {
+         return adjustSelectionRect(optRect);
+     }
+};
+
+
+
 TreeNodeViewDelegate::TreeNodeViewDelegate(TreeNodeModel* model,QWidget *parent) :
-    TreeNodeViewDelegateBase(model,parent)
+    nodeRectRad_(0),
+    drawChildCount_(true),
+    nodeStyle_(ClassicNodeStyle),
+    drawNodeType_(true),
+    bgCol_(Qt::white),
+    model_(model)
 {
+
+    drawAttrSelectionRect_=true;
+
+    attrFont_=font_;
+    attrFont_.setPointSize(8);
+    serverInfoFont_=font_;
+    suiteNumFont_=font_;
+    abortedReasonFont_=font_;
+    abortedReasonFont_.setBold(true);
+    typeFont_=font_;
+    typeFont_.setBold(true);
+    typeFont_.setPointSize(font_.pointSize()-1);
+
+    //Property
+    if(propVec.empty())
+    {
+        propVec.push_back("view.tree.nodeFont");
+        propVec.push_back("view.tree.attributeFont");
+        propVec.push_back("view.tree.display_child_count");
+        propVec.push_back("view.tree.displayNodeType");
+        propVec.push_back("view.tree.background");
+        propVec.push_back("view.common.node_style");
+
+        //Base settings
+        addBaseSettings(propVec);
+    }
+
+    prop_=new PropertyMapper(propVec,this);
+
+    //WARNING: updateSettings() cannot be called from here because
+    //nodeBox_ and attrBox_ are only created in the derived classes. So it muse be
+    //called from those derived classes.
+
+    //The parent must be the view!!!
+    animation_=new AnimationHandler(parent);
+
     nodeBox_=new TreeNodeDelegateBox;
     attrBox_=new TreeAttrDelegateBox;
 
@@ -77,123 +241,1158 @@ TreeNodeViewDelegate::TreeNodeViewDelegate(TreeNodeModel* model,QWidget *parent)
 
 TreeNodeViewDelegate::~TreeNodeViewDelegate()
 {
+    delete animation_;
 }
 
-QSize TreeNodeViewDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex & index ) const
+void TreeNodeViewDelegate::updateSettings()
 {
-    //QSize size=QStyledItemDelegate::sizeHint(option,index);
-    //QSize size(100,fontHeight_+8);
+    Q_ASSERT(nodeBox_);
+    Q_ASSERT(attrBox_);
+
+    if(VProperty* p=prop_->find("view.common.node_style"))
+    {
+        if(p->value().toString() == "classic")
+            nodeStyle_=ClassicNodeStyle;
+        else
+            nodeStyle_=BoxAndTextNodeStyle;
+    }
+    if(VProperty* p=prop_->find("view.tree.nodeRectRadius"))
+    {
+        nodeRectRad_=p->value().toInt();
+    }
+    if(VProperty* p=prop_->find("view.tree.nodeFont"))
+    {
+        QFont newFont=p->value().value<QFont>();
+
+        if(font_ != newFont )
+        {
+            font_=newFont;
+            nodeBox_->adjust(font_);
+            serverInfoFont_=font_;
+            serverNumFont_.setFamily(font_.family());
+            serverNumFont_.setPointSize(font_.pointSize()-1);
+            suiteNumFont_.setFamily(font_.family());
+            suiteNumFont_.setPointSize(font_.pointSize()-1);
+            abortedReasonFont_.setFamily(font_.family());
+            abortedReasonFont_.setPointSize(font_.pointSize());
+            typeFont_.setFamily(font_.family());
+            typeFont_.setPointSize(font_.pointSize()-1);
 
-	int attLineNum=0;
-	if((attLineNum=index.data(AbstractNodeModel::AttributeLineRole).toInt()) > 0)
-	{
-		if(attLineNum==1)
-            return attrBox_->sizeHintCache;
-		else
-		{
-            QFontMetrics fm(attrFont_);
-            QStringList lst;
-			for(int i=0; i < attLineNum; i++)
-				lst << "1";
+            Q_EMIT sizeHintChangedGlobal();
+        }
+    }
+    if(VProperty* p=prop_->find("view.tree.attributeFont"))
+    {
+        QFont newFont=p->value().value<QFont>();
+
+        if(attrFont_ != newFont)
+        {
+            attrFont_=newFont;
+            attrBox_->adjust(attrFont_);
+            Q_EMIT sizeHintChangedGlobal();
+        }
+    }
+
+    if(VProperty* p=prop_->find("view.tree.display_child_count"))
+    {
+        drawChildCount_=p->value().toBool();
+    }
 
-            //return QSize(100,fm.size(0,lst.join(QString('\n'))).height()+6);
-            return QSize(100,labelHeight(attLineNum));
+    if(VProperty* p=prop_->find("view.tree.displayNodeType"))
+    {
+        drawNodeType_=p->value().toBool();
+    }
+
+    if(VProperty* p=prop_->find("view.tree.background"))
+    {
+        bgCol_=p->value().value<QColor>();
+    }
+
+    //Update the settings handled by the base class
+    updateBaseSettings();
+}
 
-		}
-	}
+bool TreeNodeViewDelegate::isSingleHeight(int h) const
+{
+    return (h==nodeBox_->fullHeight || h == attrBox_->fullHeight);
+}
 
+QSize TreeNodeViewDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex & index ) const
+{
     return nodeBox_->sizeHintCache;
 }
 
+//This has to be extremely fast
+void  TreeNodeViewDelegate::sizeHint(const QModelIndex& index,int& w,int& h) const
+{
+    QVariant tVar=index.data(Qt::DisplayRole);
+
+    h=nodeBox_->fullHeight;
+
+    //For nodes we compute the exact size of visual rect
+    if(tVar.type() == QVariant::String)
+    {
+        QString text=index.data(Qt::DisplayRole).toString();
+        if(index.data(AbstractNodeModel::ServerRole).toInt() ==0)
+        {
+            widthHintServer(index,w,text);
+        }
+        else
+        {
+            w=nodeWidth(index,text);
+        }
+    }
+    //For attributes we do not need the exact width since they do not have children so
+    //there is nothing on their right in the view. We compute their proper size when
+    //they are first rendered. However the exact height must be known at this stage!
+    else if(tVar.type() == QVariant::StringList)
+    {
+        //Each attribute has this height except the multiline labels
+        h=attrBox_->fullHeight;
+
+        //It is a big enough hint for the width.
+        w=300;
+
+        //For multiline labels we need to compute the height
+        int attLineNum=0;
+        if((attLineNum=index.data(AbstractNodeModel::AttributeLineRole).toInt()) > 1)
+        {
+            h=labelHeight(attLineNum);
+        }
+    }
+}
+
 void TreeNodeViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,
-		           const QModelIndex& index) const
+                   const QModelIndex& index,QSize& size) const
 {
-	//Background
+    size=QSize(0,0);
+
+    //Background
     QStyleOptionViewItem vopt(option);
-	initStyleOption(&vopt, index);
-
-	//Both the plastique and fusion styles render the tree expand indicator in the middle of the
-	//indentation rectangle. This rectangle spans as far as the left hand side of the option rect that the
-	//delegate renders into. For large indentations there can be a big gap between the indicator and
-	//rendered item. To avoid it we expand the opt rect to the left to get it closer to the
-	//indicator as much as possible.
-
-	if(indentation_>0)
-        //vopt.rect.setLeft(vopt.rect.x()-indentation_/2 + 10);
-        vopt.rect.setLeft(vopt.rect.x()-indentation_/2 + 5);
-
-	//Save painter state
-	painter->save();
-
-	//Selection - we only do it once
-	/*if(index.column() == 0)
-	{
-		QRect fullRect=QRect(0,option.rect.y(),painter->device()->width(),option.rect.height());
-
-		if(option.state & QStyle::State_Selected)
-		{
-			//QRect fillRect=option.rect.adjusted(0,1,-1,-textRect.height()-1);
-			painter->fillRect(fullRect,selectBrush_);
-			painter->setPen(selectPen_);
-			painter->drawLine(fullRect.topLeft(),fullRect.topRight());
-			painter->drawLine(fullRect.bottomLeft(),fullRect.bottomRight());
-		}
-		else if(option.state & QStyle::State_MouseOver)
-		{
-			//QRect fillRect=option.rect.adjusted(0,1,-1,-1);
-			painter->fillRect(fullRect,hoverBrush_);
-			painter->setPen(hoverPen_);
-			painter->drawLine(fullRect.topLeft(),fullRect.topRight());
-			painter->drawLine(fullRect.bottomLeft(),fullRect.bottomRight());
-		}
-	}*/
-
-	if(index.data(AbstractNodeModel::ConnectionRole).toInt() == 0)
-	{
-		QRect fullRect=QRect(0,vopt.rect.y(),painter->device()->width(),vopt.rect.height());
-		painter->fillRect(fullRect,lostConnectBgBrush_);
-		QRect bandRect=QRect(0,vopt.rect.y(),5,vopt.rect.height());
-		painter->fillRect(bandRect,lostConnectBandBrush_);
-
-	}
-
-	//First column (nodes)
-	if(index.column() == 0)
-	{
-		QVariant tVar=index.data(Qt::DisplayRole);		
-		painter->setFont(font_);
-
-		if(tVar.type() == QVariant::String)
-		{
-			QString text=index.data(Qt::DisplayRole).toString();
-			if(index.data(AbstractNodeModel::ServerRole).toInt() ==0)
-			{
-				renderServer(painter,index,vopt,text);
-			}
-			else
-			{
-				renderNode(painter,index,vopt,text);
-			}
-		}
-		//Render attributes
-		else if(tVar.type() == QVariant::StringList)
-		{
-			QStringList lst=tVar.toStringList();
-			if(lst.count() > 0)
-			{
-				QMap<QString,AttributeRendererProc>::const_iterator it=attrRenderers_.find(lst.at(0));
-				if(it != attrRenderers_.end())
-				{
-					AttributeRendererProc a=it.value();
-					(this->*a)(painter,lst,vopt);
-				}
-			}
-
-		}
-    }
-
-	painter->restore();
-
-	//else
-	//	QStyledItemDelegate::paint(painter,option,index);
+    initStyleOption(&vopt, index);
+
+    //Save painter state
+    painter->save();
+
+    if(index.data(AbstractNodeModel::ConnectionRole).toInt() == 0)
+    {
+        QRect fullRect=QRect(0,vopt.rect.y(),painter->device()->width(),vopt.rect.height());
+        painter->fillRect(fullRect,lostConnectBgBrush_);
+        QRect bandRect=QRect(0,vopt.rect.y(),5,vopt.rect.height());
+        painter->fillRect(bandRect,lostConnectBandBrush_);
+    }
+
+    QVariant tVar=index.data(Qt::DisplayRole);
+    painter->setFont(font_);
+
+    if(tVar.type() == QVariant::String)
+    {
+        int width=0;
+        QString text=index.data(Qt::DisplayRole).toString();
+        if(index.data(AbstractNodeModel::ServerRole).toInt() ==0)
+        {
+            width=renderServer(painter,index,vopt,text);
+        }
+        else
+        {
+            width=renderNode(painter,index,vopt,text);
+        }
+
+        size=QSize(width,nodeBox_->fullHeight);
+    }
+    //Render attributes
+    else if(tVar.type() == QVariant::StringList)
+    {
+        QStringList lst=tVar.toStringList();
+        if(lst.count() > 0)
+        {
+            QMap<QString,AttributeRendererProc>::const_iterator it=attrRenderers_.find(lst.at(0));
+            if(it != attrRenderers_.end())
+            {
+                AttributeRendererProc a=it.value();
+                (this->*a)(painter,lst,vopt,size);
+            }
+            //if(width==0)
+            //    width=300;
+        }
+
+    }
+
+    painter->restore();
+
+    //else
+    //	QStyledItemDelegate::paint(painter,option,index);
+}
+
+
+
+int TreeNodeViewDelegate::renderServer(QPainter *painter,const QModelIndex& index,
+                                           const QStyleOptionViewItem& option,QString text) const
+{
+    ServerHandler* server=static_cast<ServerHandler*>(index.data(AbstractNodeModel::ServerPointerRole).value<void*>());
+    Q_ASSERT(server);
+
+    int totalWidth=0;
+    bool selected=option.state & QStyle::State_Selected;
+    //int offset=nodeBox_->leftMargin;
+    QFontMetrics fm(font_);
+
+    //The initial filled rect (we will adjust its  width)
+    QRect itemRect=option.rect.adjusted(nodeBox_->leftMargin,nodeBox_->topMargin,0,-nodeBox_->bottomMargin);
+
+#if 0
+    painter->setPen(QColor(190,190,190));
+    painter->drawLine(0,option.rect.y()+1,painter->device()->width(),option.rect.y()+1);
+    painter->drawLine(0,option.rect.bottom()-1,painter->device()->width(),option.rect.bottom()-1);
+#endif
+#if 0
+
+    QRect progRect(0,itemRect.y()-deltaH,painter->device()->width(),itemRect.height()+2*deltaH);
+    progRect.setWidth(painter->device()->width());
+    painter->setBrush(Qt::NoBrush);
+    painter->setPen(QColor(190,190,190));
+    painter->drawRect(progRect);
+    painter->setBrush(QColor(230,230,230));
+    painter->drawRect(progRect.adjusted(0,0,-progRect.width()*0.4,0));
+#endif
+
+    int currentRight=itemRect.x();
+
+    NodeShape stateShape;
+    stateShape.col_=index.data(Qt::BackgroundRole).value<QColor>();
+
+    NodeText nodeText;
+    nodeText.text_=text;
+    int textWidth=fm.width(text);
+
+    if(nodeStyle_ == BoxAndTextNodeStyle)
+    {
+        stateShape.shape_=QPolygon(QRect(itemRect.x(),itemRect.y(),itemRect.height(),itemRect.height()));
+        QRect shBr=stateShape.shape_.boundingRect();
+        currentRight=shBr.x()+shBr.width()+2;
+        nodeText.br_=QRect(currentRight,itemRect.y(),textWidth+nodeBox_->leftPadding, itemRect.height());
+        nodeText.fgCol_=QColor(Qt::black);
+        currentRight=nodeText.br_.x()+nodeText.br_.width();
+    }
+    else
+    {
+        stateShape.shape_=QPolygon(QRect(itemRect.x(),itemRect.y(),textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding,itemRect.height()));
+        nodeText.br_=QRect(itemRect.x()+nodeBox_->leftPadding,itemRect.y(),textWidth, itemRect.height());
+        nodeText.fgCol_=index.data(Qt::ForegroundRole).value<QColor>();
+        QRect shBr=stateShape.shape_.boundingRect();
+        currentRight=shBr.x()+shBr.width();;
+    }
+
+    //Refresh timer
+   /* bool hasTimer=true;
+    QRect timeRect(currentRight+offset,itemRect.y()-1,itemRect.height()+2,itemRect.height()+2);
+    currentRight=timeRect.right();*/
+
+    //Icons area
+    QList<QPixmap> pixLst;
+    QList<QRect> pixRectLst;
+
+    QVariant va=index.data(AbstractNodeModel::IconRole);
+    if(va.type() == QVariant::List)
+    {
+        QVariantList lst=va.toList();
+        if(lst.count() >0)
+        {
+            int xp=currentRight+nodeBox_->iconPreGap;
+            int yp=itemRect.center().y()+1-nodeBox_->iconSize/2;
+            for(int i=0; i < lst.count(); i++)
+            {
+                int id=lst[i].toInt();
+                if(id != -1)
+                {
+                    pixLst << IconProvider::pixmap(id,nodeBox_->iconSize);
+                    pixRectLst << QRect(xp,yp,nodeBox_->iconSize,nodeBox_->iconSize);
+                    xp+=nodeBox_->iconSize+nodeBox_->iconGap;
+                }
+            }
+
+            if(!pixLst.isEmpty())
+            {
+                currentRight=xp-nodeBox_->iconGap;
+            }
+        }
+    }
+
+    //The pixmap (optional)
+    bool hasPix=false;
+    QRect pixRect;
+
+    //The info rectangle (optional)
+    QRect infoRect;
+    QString infoTxt=index.data(AbstractNodeModel::InfoRole).toString();
+    bool hasInfo=(infoTxt.isEmpty() == false);
+
+    if(hasInfo)
+    {
+        //infoFont.setBold(true);
+        fm=QFontMetrics(serverInfoFont_);
+
+        int infoWidth=fm.width(infoTxt);
+        infoRect = nodeText.br_;
+        infoRect.setLeft(currentRight+fm.width('A'));
+        infoRect.setWidth(infoWidth);
+        currentRight=infoRect.x()+infoRect.width();
+    }
+
+    //The load icon (optional)
+    QRect loadRect;
+    bool hasLoad=index.data(AbstractNodeModel::LoadRole).toBool();
+    Animation* an=0;
+
+    //Update load animation
+    if(hasLoad)
+    {
+        an=animation_->find(Animation::ServerLoadType,true);
+
+        loadRect = QRect(currentRight+fm.width('A'),
+                        itemRect.top()+(itemRect.height()-an->scaledSize().height())/2,
+                        an->scaledSize().width(),
+                        an->scaledSize().height());
+
+        currentRight=loadRect.x()+loadRect.width();
+
+        //Add this index to the animations
+        //There is no guarantee that this index will be valid in the future!!!
+        an->addTarget(server->vRoot());
+    }
+    //Stops load animation
+    else
+    {
+        if((an=animation_->find(Animation::ServerLoadType,false)) != NULL)
+            an->removeTarget(server->vRoot());
+    }
+
+    //The node number (optional)
+    QRect numRect;
+    QString numTxt;
+    bool hasNum=false;
+
+    if(drawChildCount_)
+    {
+        QVariant va=index.data(AbstractNodeModel::NodeNumRole);
+        hasNum=(va.isNull() == false);
+        if(hasNum)
+        {
+            numTxt="(" + QString::number(va.toInt()) + ")";
+
+            QFontMetrics fmNum(serverNumFont_);
+
+            int numWidth=fmNum.width(numTxt);
+            numRect = nodeText.br_;
+            numRect.setLeft(currentRight+fmNum.width('A')/2);
+            numRect.setWidth(numWidth);
+            currentRight=numRect.x()+numRect.width();
+        }
+    }
+
+    //Update
+#if 0
+    bool hasUpdate=false;
+    ServerUpdateData updateData;
+    if(server)
+    {
+        hasUpdate=true;
+        updateData.br_=QRect(currentRight+3*offset,itemRect.y()-1,0,itemRect.height()+2);
+        updateData.prevTime_=server->secsSinceLastRefresh();
+        updateData.nextTime_=server->secsTillNextRefresh();
+        if(updateData.prevTime_ >=0)
+        {
+            if(updateData.nextTime_ >=0)
+            {
+                updateData.prevText_="-" + formatTime(updateData.prevTime_);
+                updateData.nextText_="+" +formatTime(updateData.nextTime_);
+                updateData.prog_=(static_cast<float>(updateData.prevTime_)/static_cast<float>(updateData.prevTime_+updateData.nextTime_));
+                updateData.br_.setWidth(fm.width("ABCDE")+fm.width(updateData.prevText_)+fm.width(updateData.nextText_)+2*offset);
+            }
+            else
+            {
+                updateData.prevText_="last update: " + formatTime(updateData.prevTime_);
+                updateData.prog_=0;
+                updateData.br_.setWidth(fm.width(updateData.prevText_));
+            }
+            currentRight=updateData.br_.right();
+         }
+        else
+        {
+            hasUpdate=false;
+        }
+    }
+#endif
+
+    //Define clipping
+    int rightPos=currentRight+1;
+    totalWidth=rightPos-option.rect.left();
+    const bool setClipRect = rightPos > option.rect.right();
+    if(setClipRect)
+    {
+        painter->save();
+        painter->setClipRect(option.rect);
+    }
+
+    //Draw state/node rect
+    renderServerCell(painter,stateShape,nodeText,selected);
+
+    //Draw timer
+    /*int remaining=6*60*1000; //   server->remainingTimeToRefresh();
+    int total=10*60*1000; //server->refreshPeriod() ;
+    renderTimer(painter,timeRect,remaining,total);*/
+
+    //Draw icons
+    for(int i=0; i < pixLst.count(); i++)
+    {
+        painter->drawPixmap(pixRectLst[i],pixLst[i]);
+    }
+
+    //Draw pixmap if needed
+    if(hasPix)
+    {
+        painter->drawPixmap(pixRect,errPix_);
+    }
+
+    //Draw info
+    if(hasInfo)
+    {
+        painter->setPen(Qt::black);
+        painter->setFont(serverInfoFont_);
+        painter->drawText(infoRect,Qt::AlignLeft | Qt::AlignVCenter,infoTxt);
+    }
+
+    //Draw number
+    if(hasNum)
+    {
+        painter->setPen(childCountColour);
+        painter->setFont(serverNumFont_);
+        painter->drawText(numRect,Qt::AlignLeft | Qt::AlignVCenter,numTxt);
+    }
+
+    //Draw load animation
+    if(hasLoad)
+    {
+        Animation* an=animation_->find(Animation::ServerLoadType,false);
+        if(an)
+        {
+            painter->drawPixmap(loadRect,an->currentPixmap());
+        }
+    }
+#if 0
+    if(hasUpdate)
+    {
+        renderServerUpdate(painter,updateData);
+    }
+#endif
+    if(setClipRect)
+    {
+        painter->restore();
+    }
+
+    return totalWidth;
+}
+
+int TreeNodeViewDelegate::renderNode(QPainter *painter,const QModelIndex& index,
+                                    const QStyleOptionViewItem& option,QString text) const
+{
+    int totalWidth=0;
+    bool selected=option.state & QStyle::State_Selected;
+    QFontMetrics fm(font_);
+
+    //The initial filled rect (we will adjust its  width)
+    QRect itemRect=option.rect.adjusted(nodeBox_->leftMargin,nodeBox_->topMargin,0,-nodeBox_->bottomMargin);
+
+    NodeShape stateShape;
+    NodeShape realShape;
+    NodeText  nodeText;
+    NodeText  typeText;
+
+    //get the colours
+    QVariant bgVa=index.data(Qt::BackgroundRole);
+    bool hasRealBg=false;
+    if(bgVa.type() == QVariant::List)
+    {
+        QVariantList lst=bgVa.toList();
+        if(lst.count() ==  2)
+        {
+            hasRealBg=true;
+            stateShape.col_=lst[0].value<QColor>();
+            realShape.col_=lst[1].value<QColor>();
+        }
+    }
+    else
+    {
+        stateShape.col_=bgVa.value<QColor>();
+    }
+
+    int currentRight=itemRect.x();
+
+    //Node type
+    QFontMetrics fmType(typeFont_);
+    int typeWidth=fmType.width(" S");
+
+    if(drawNodeType_)
+    {
+        int nodeType=index.data(AbstractNodeModel::NodeTypeRole).toInt();
+        switch(nodeType)
+        {
+        case 0: typeText.text_="S"; break;
+        case 1: typeText.text_="F"; break;
+        case 2: typeText.text_="T"; break;
+        case 3: typeText.text_="A"; break;
+        default: break;
+        }
+    }
+
+    //The text rectangle
+    nodeText.text_=text;
+    int textWidth=fm.width(text);
+
+    if(nodeStyle_ == BoxAndTextNodeStyle)
+    {
+        int realW=itemRect.height()/4;
+
+        QRect r1(currentRight,itemRect.y(),itemRect.height(),itemRect.height());
+        if(hasRealBg)
+            r1.adjust(0,0,-realW,0);
+
+        stateShape.shape_=QPolygon(r1);
+
+        if(hasRealBg)
+        {
+            QRect r2(r1.x()+r1.width(),r1.top(),realW+1,r1.height());
+            realShape.shape_=QPolygon(r2);
+            currentRight=r2.x()+r2.width()+2;
+        }
+        else
+            currentRight=r1.x()+r1.width()+2;
+
+        if(drawNodeType_)
+        {
+            typeText.br_=r1;
+            typeText.fgCol_=index.data(AbstractNodeModel::NodeTypeForegroundRole).value<QColor>();
+        }
+
+        nodeText.br_=QRect(currentRight,r1.top(),textWidth+nodeBox_->leftPadding,r1.height());
+        nodeText.fgCol_=QColor(Qt::black);
+        currentRight=nodeText.br_.x() + nodeText.br_.width();
+
+#if 0
+        if(nodeStyle_ == BoxAndTextNodeStyle)
+        {
+            int realW=itemRect.height()/4;
+
+            //state box
+            currentRight+=itemRect.height();
+            if(hasRealBg)
+            {
+                currentRight+=1;
+            }
+            currentRight+=2;
+
+            //node name
+            currentRight+=textWidth+nodeBox_->leftPadding;
+        }
+#endif
+
+    }
+    //Classic style
+    else
+    {
+        if(drawNodeType_)
+        {
+            typeText.br_=QRect(currentRight,itemRect.y(),typeWidth,itemRect.height());
+            typeText.fgCol_=typeFgColourClassic;
+            typeText.bgCol_=typeBgColourClassic;
+            currentRight=typeText.br_.x()+typeText.br_.width()+2;
+        }
+
+        QRect r1(currentRight,itemRect.y(),textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding,itemRect.height());
+        stateShape.shape_=QPolygon(r1);
+        currentRight=r1.x()+r1.width();
+
+        nodeText.br_=QRect(r1.left()+nodeBox_->leftPadding,r1.top(),textWidth,r1.height());
+        nodeText.fgCol_=index.data(Qt::ForegroundRole).value<QColor>();
+
+        if(hasRealBg)
+        {
+            int realW=6;
+            QRect r2(r1.x()+r1.width(),r1.top(),realW+1,r1.height());
+            realShape.shape_=QPolygon(r2);
+            currentRight=r2.x()+r2.width();
+        }
+    }
+
+    //Icons area
+    QList<QPixmap> pixLst;
+    QList<QRect> pixRectLst;
+
+    QVariant va=index.data(AbstractNodeModel::IconRole);
+    if(va.type() == QVariant::List)
+    {
+        QVariantList lst=va.toList();
+        if(lst.count() >0)
+        {
+            int xp=currentRight+nodeBox_->iconPreGap;
+            int yp=itemRect.center().y()+1-nodeBox_->iconSize/2;
+            for(int i=0; i < lst.count(); i++)
+            {
+                int id=lst[i].toInt();
+                if(id != -1)
+                {
+                    pixLst << IconProvider::pixmap(id,nodeBox_->iconSize);
+                    pixRectLst << QRect(xp,yp,nodeBox_->iconSize,nodeBox_->iconSize);
+                    xp+=nodeBox_->iconSize+nodeBox_->iconGap;
+                }
+            }
+
+            if(!pixLst.isEmpty())
+            {
+                currentRight=xp-nodeBox_->iconGap;
+            }
+        }
+    }
+
+    //The node number (optional)
+    QRect numRect;
+    QString numTxt;
+    bool hasNum=false;
+
+    if(drawChildCount_)
+    {
+        va=index.data(AbstractNodeModel::NodeNumRole);
+        hasNum=(va.isNull() == false);
+
+        if(hasNum)
+        {
+            numTxt="(" + va.toString() + ")";
+            QFontMetrics fmNum(suiteNumFont_);
+
+            int numWidth=fmNum.width(numTxt);
+            numRect = nodeText.br_;
+            numRect.setLeft(currentRight+fmNum.width('A')/2);
+            numRect.setWidth(numWidth);
+            currentRight=numRect.x()+numRect.width();
+        }
+    }
+
+    //The aborted reason
+    QRect reasonRect;
+    QString reasonTxt=index.data(AbstractNodeModel::AbortedReasonRole).toString();
+    if(reasonTxt.contains('\n'))
+        reasonTxt=reasonTxt.split("\n").first();
+
+    bool hasReason=(!reasonTxt.isEmpty());
+    if(hasReason)
+    {
+        QFontMetrics fmReason(abortedReasonFont_);
+        reasonRect = nodeText.br_;
+        reasonRect.setLeft(currentRight+fmReason.width('A')/2);
+        reasonTxt=fmReason.elidedText(reasonTxt,Qt::ElideRight,220);
+        reasonRect.setWidth(fmReason.width(reasonTxt));
+        currentRight=reasonRect.x()+reasonRect.width();
+    }
+
+    //Define clipping
+    int rightPos=currentRight+1;
+    totalWidth=rightPos-option.rect.left();
+
+#if 0
+    const bool setClipRect = rightPos > option.rect.right();
+    if(setClipRect)
+    {
+        painter->save();
+        painter->setClipRect(option.rect);
+    }
+#endif
+
+
+    renderNodeCell(painter,stateShape,realShape,nodeText,typeText,selected);
+
+    //Draw icons
+    for(int i=0; i < pixLst.count(); i++)
+    {
+        //painter->fillRect(pixRectLst[i],Qt::black);
+        painter->drawPixmap(pixRectLst[i],pixLst[i]);
+    }
+
+    //Draw number
+    if(hasNum)
+    {
+        painter->setPen(childCountColour);
+        painter->setFont(suiteNumFont_);
+        painter->drawText(numRect,Qt::AlignLeft | Qt::AlignVCenter,numTxt);
+    }
+
+    //Draw aborted reason
+    if(hasReason)
+    {
+        painter->setPen(stateShape.col_.darker(120));
+        painter->setFont(abortedReasonFont_);
+        painter->drawText(reasonRect,Qt::AlignLeft | Qt::AlignVCenter,reasonTxt);
+    }
+#if 0
+    if(setClipRect)
+    {
+        painter->restore();
+    }
+#endif
+    return totalWidth;
+}
+
+void TreeNodeViewDelegate::renderServerCell(QPainter *painter,const NodeShape& stateShape,
+                                        const NodeText& text,bool selected) const
+{
+    renderNodeShape(painter,stateShape);
+
+    //Draw text
+    painter->setFont(font_);
+    painter->setPen(QPen(text.fgCol_,0));
+    painter->drawText(text.br_,Qt::AlignHCenter | Qt::AlignVCenter,text.text_);
+
+    //selection
+    painter->setPen(nodeSelectPen_);
+    painter->setBrush(Qt::NoBrush);
+    QPolygon sel=stateShape.shape_;
+
+    if(selected)
+    {
+        if(nodeStyle_ == BoxAndTextNodeStyle)
+        {
+            sel=sel.united(QPolygon(text.br_.adjusted(0,0,2,0)));
+        }
+        painter->drawRect(sel.boundingRect());
+    }
+}
+
+void TreeNodeViewDelegate::renderNodeCell(QPainter *painter,const NodeShape& stateShape,const NodeShape &realShape,
+                             const NodeText& nodeText,const NodeText& typeText,bool selected) const
+{
+    renderNodeShape(painter,stateShape);
+    renderNodeShape(painter,realShape);
+
+    //Draw type
+    if(drawNodeType_)
+    {
+        if(typeText.bgCol_.isValid())
+        {
+            //painter->fillRect(typeText.br_,typeText.bgCol_);
+            painter->setBrush(typeText.bgCol_);
+            painter->setPen(typeText.bgCol_);
+            painter->drawRect(typeText.br_);
+        }
+        painter->setFont(typeFont_);
+        painter->setPen(typeText.fgCol_);
+        painter->setBrush(Qt::NoBrush);
+        painter->drawText(typeText.br_,Qt::AlignCenter,typeText.text_);
+   }
+
+    //Draw text
+    painter->setFont(font_);
+    painter->setPen(QPen(nodeText.fgCol_,0));
+    painter->drawText(nodeBox_->adjustTextRect(nodeText.br_),Qt::AlignHCenter | Qt::AlignVCenter,nodeText.text_);
+
+    //selection
+    painter->setPen(nodeSelectPen_);
+    painter->setBrush(Qt::NoBrush);
+    QPolygon sel=stateShape.shape_;
+
+    if(selected)
+    {
+        if(nodeStyle_ == BoxAndTextNodeStyle)
+        {
+            if(!realShape.shape_.isEmpty())
+                sel=sel.united(realShape.shape_);
+
+            sel=sel.united(QPolygon(nodeText.br_.adjusted(0,0,0,0)));
+        }
+        else
+        {
+            if(!realShape.shape_.isEmpty())
+                sel=sel.united(realShape.shape_);
+        }
+        painter->drawRect(sel.boundingRect());
+    }
+
+   /*
+
+        if(nodeStyle_ == BoxAndTextNodeStyle)
+        {
+            painter->setFont(typeFont_);
+            painter->setPen();
+            painter->drawText(typeText.br_,Qt::AlignCenter,typeText.text_);
+        }
+        else
+        {
+            painter->setPen(Qt::NoPen);
+
+            if(typeTxt == "S")
+                painter->setBrush(QColor(150,150,150)); //bgBrush);
+            else if(typeTxt == "F")
+                painter->setBrush(QColor(150,150,150)); //bgBrush);
+            else
+                painter->setBrush(QColor(190,190,190)); //bgBrush);
+
+            painter->drawRect(typeRect);
+
+            painter->setPen(Qt::white);
+            painter->setFont(typeFont_);
+            painter->drawText(typeRect,Qt::AlignCenter,typeTxt);
+         }
+    }
+
+    //Draw text
+    painter->setFont(font_);
+    painter->setPen(QPen(fg,0));
+    painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
+
+    //selection
+    painter->setPen(nodeSelectPen_);
+    painter->setBrush(Qt::NoBrush);
+    QPolygon sel=stateShape.shape_;
+
+    if(selected)
+    {
+        if(nodeStyle_ == BoxAndTextNodeStyle)
+        {
+            if(!realShape.shape_.isEmpty())
+                sel=sel.united(realShape.shape_);
+
+            sel=sel.united(QPolygon(textRect.adjusted(0,0,2,0)));
+        }
+        else
+        {
+            if(!realShape.shape_.isEmpty())
+                sel=sel.united(realShape.shape_);
+        }
+        painter->drawRect(sel.boundingRect());
+        //painter->drawPolygon(sel);
+    }
+*/
+    //painter->setRenderHints(QPainter::Antialiasing,false);
+}
+
+
+void TreeNodeViewDelegate::renderNodeShape(QPainter* painter,const NodeShape& shape) const
+{
+    if(shape.shape_.isEmpty())
+        return;
+
+    QColor bg=shape.col_;
+    QColor bgLight, borderCol;
+    Palette::statusColours(bg,bgLight,borderCol);
+
+    QBrush bgBrush;
+    if(useStateGrad_)
+    {
+        grad_.setColorAt(0,bgLight);
+        grad_.setColorAt(1,bg);
+        bgBrush=QBrush(grad_);
+    }
+    else
+        bgBrush=QBrush(bg);
+
+    //Fill  shape
+    painter->setPen(borderCol);
+    painter->setBrush(bgBrush);
+    painter->drawPolygon(shape.shape_);
+}
+
+void TreeNodeViewDelegate::renderTimer(QPainter *painter,QRect target,int remaining, int total) const
+{
+    QImage img(target.width(),target.height(),QImage::Format_ARGB32_Premultiplied);
+    QRect r=img.rect().adjusted(2,2,-2,-2);
+    img.fill(Qt::transparent);
+    QPainter p(&img);
+    p.setRenderHint(QPainter::Antialiasing,true);
+
+    int angle=static_cast<int>(360.*static_cast<float>(total-remaining)/static_cast<float>(total));
+    /*angle-=90.;
+    if(angle >=0 && angle <= 90) angle=90-angle;
+    else
+       angle=450-angle;*/
+
+    QColor c(43,97,158);
+
+    QBrush b(c);
+    p.setBrush(b);
+    p.setPen(c);
+    p.drawPie(r,90*16,-angle*16);
+    p.setBrush(Qt::NoBrush);
+    p.drawEllipse(r);
+
+    painter->drawImage(target,img,img.rect());
+}
+
+
+void TreeNodeViewDelegate::renderServerUpdate(QPainter* painter,const ServerUpdateData& data) const
+{
+    QFont font(font_);
+    font.setPointSize(font_.pointSize()-1);
+    QFontMetrics fm(font);
+    painter->setFont(font);
+    painter->setPen(Qt::black);
+
+    QColor minCol=QColor(198,215,253);
+    QColor maxCol=QColor(43,97,158);
+
+    QRect r1=data.br_;
+    r1.setWidth(fm.width(data.prevText_));
+    painter->setPen(minCol);
+    //painter->setPen(Qt::red);
+    painter->drawText(r1,Qt::AlignLeft | Qt::AlignVCenter,data.prevText_);
+
+    if(!data.prevText_.isEmpty())
+    {
+        QRect r2=data.br_;
+        r2.setX(data.br_.right()-fm.width(data.nextText_));
+        //painter->setPen(QColor(1,128,73));
+        painter->setPen(maxCol);
+        painter->drawText(r2,Qt::AlignRight | Qt::AlignVCenter,data.nextText_);
+
+        int dh=(data.br_.height()-fm.height()+1)/2;
+        QRect r=data.br_.adjusted(r1.width()+4,2*dh,-r2.width()-4,-2*dh);
+
+        int pos=static_cast<int>(data.prog_* r.width());
+        QRect rPrev=r.adjusted(0,0,-(r.width()-pos),0);
+
+        QLinearGradient grad;
+        grad.setCoordinateMode(QGradient::ObjectBoundingMode);
+        grad.setStart(0,0);
+        grad.setFinalStop(1,0);
+        QColor posCol=interpolate(minCol,maxCol,data.prog_);
+
+        grad.setColorAt(0,minCol);
+        grad.setColorAt(1,posCol);
+        painter->setPen(Qt::NoPen);
+        painter->setBrush(grad);
+        painter->drawRect(rPrev);
+
+        painter->setBrush(Qt::NoBrush);
+        painter->setPen(QColor(190,190,190));
+        painter->drawRect(r);
+    }
+}
+
+void TreeNodeViewDelegate::widthHintServer(const QModelIndex& index,int& itemWidth, QString text) const
+{
+    ServerHandler* server=static_cast<ServerHandler*>(index.data(AbstractNodeModel::ServerPointerRole).value<void*>());
+    Q_ASSERT(server);
+
+    QFontMetrics fm(font_);
+
+    //The initial filled rect. We only care of the width
+    QRect itemRect(nodeBox_->leftMargin,0,10,10);
+    int currentRight=itemRect.left();
+
+    NodeShape stateShape;
+
+    NodeText nodeText;
+    nodeText.text_=text;
+    int textWidth=fm.width(text);
+
+    if(nodeStyle_ == BoxAndTextNodeStyle)
+    {
+        currentRight+=2+textWidth+nodeBox_->leftPadding;
+    }
+    else
+    {
+        currentRight+=textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding;
+    }
+
+    //Icons area
+    Q_ASSERT(model_);
+    int pixNum=model_->iconNum(server->vRoot());
+    if(pixNum > 0)
+    {
+        currentRight+=nodeBox_->iconPreGap+pixNum*nodeBox_->iconSize + (pixNum-1)*nodeBox_->iconGap;
+    }
+
+    //The info rectangle (optional)
+    QString infoTxt=index.data(AbstractNodeModel::InfoRole).toString();
+    bool hasInfo=(infoTxt.isEmpty() == false);
+
+    if(hasInfo)
+    {
+        fm=QFontMetrics(serverInfoFont_);
+        int infoWidth=fm.width(infoTxt);
+        currentRight+=fm.width('A')+infoWidth;
+    }
+
+    //The load icon (optional)
+    bool hasLoad=index.data(AbstractNodeModel::LoadRole).toBool();
+    Animation* an=0;
+
+    //Update load animation
+    if(hasLoad)
+    {
+        an=animation_->find(Animation::ServerLoadType,true);
+        currentRight+=fm.width('A')+an->scaledSize().width();
+    }
+    //Stops load animation
+    else
+    {
+        //if((an=animation_->find(Animation::ServerLoadType,false)) != NULL)
+        //    an->removeTarget(server->vRoot());
+    }
+
+    //The node number (optional)
+    QString numTxt;
+    bool hasNum=false;
+
+    if(drawChildCount_)
+    {
+        QVariant va=index.data(AbstractNodeModel::NodeNumRole);
+        hasNum=(va.isNull() == false);
+        if(hasNum)
+        {
+            numTxt="(" + QString::number(va.toInt()) + ")";
+            QFontMetrics fmNum(serverNumFont_);
+            int numWidth=fmNum.width(numTxt);
+            currentRight+=fmNum.width('A')/2+numWidth;
+        }
+    }
+
+    itemWidth=currentRight+1;
+}
+
+int TreeNodeViewDelegate::nodeWidth(const QModelIndex& index,QString text) const
+{
+    VNode* node=static_cast<VNode*>(index.data(AbstractNodeModel::NodePointerRole).value<void*>());
+    Q_ASSERT(node);
+
+    int offset=nodeBox_->leftMargin;
+    QFontMetrics fm(font_);
+
+    //The initial filled rect. We only care about the width!
+    QRect itemRect(offset,0,10,10);
+    int currentRight=itemRect.left();
+
+    bool hasRealBg=node->isSuspended();
+
+    //Node type
+    QFontMetrics fmType(typeFont_);
+    int typeWidth=fmType.width(" S");
+
+    //The text rectangle
+    int textWidth=fm.width(text);
+
+    if(nodeStyle_ == BoxAndTextNodeStyle)
+    {       
+        //state box
+        currentRight+=itemRect.height();
+        if(hasRealBg)
+        {
+            currentRight+=1;
+        }
+        currentRight+=2;
+
+        //node name
+        currentRight+=textWidth+nodeBox_->leftPadding;
+    }
+    //Classic style
+    else
+    {
+        //node type box
+        if(drawNodeType_)
+        {
+            currentRight+=typeWidth+2;
+        }
+
+        //node name + state
+        currentRight+=textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding;
+
+        if(hasRealBg)
+        {
+            int realW=6;
+            currentRight+=realW+1;
+        }
+    }
+
+    //Icons area
+    int pixNum=0;
+
+    //in some subclasses we might not have a model_
+    if(model_)
+    {
+        pixNum=model_->iconNum(node);
+        if(pixNum > 0)
+        {
+            currentRight+=nodeBox_->iconPreGap+pixNum*nodeBox_->iconSize + (pixNum-1)*nodeBox_->iconGap;
+        }
+    }
+    else
+    {
+        QVariant va=index.data(AbstractNodeModel::IconRole);
+        if(va.type() == QVariant::List)
+        {
+            QVariantList lst=va.toList();
+            pixNum=lst.count();
+        }
+    }
+
+    if(pixNum > 0)
+    {
+        currentRight+=nodeBox_->iconPreGap+pixNum*nodeBox_->iconSize + (pixNum-1)*nodeBox_->iconGap;
+    }
+
+
+    //The node number (optional)
+    if(drawChildCount_)
+    {
+        if(node->isTopLevel())
+        {
+            QVariant va=index.data(AbstractNodeModel::NodeNumRole);
+            if(va.isNull() == false)
+            {
+                QString numTxt="(" + va.toString() + ")";
+                QFontMetrics fmNum(suiteNumFont_);
+                int numWidth=fmNum.width(numTxt);
+                currentRight+=fmNum.width('A')/2+numWidth;
+            }
+        }
+    }
+
+    //The aborted reason
+    if(node->isAborted())
+    {
+        QString reasonTxt=QString::fromStdString(node->abortedReason());
+        if(reasonTxt.contains('\n'))
+            reasonTxt=reasonTxt.split("\n").first();
+
+        bool hasReason=(!reasonTxt.isEmpty());
+        if(hasReason)
+        {
+            QFontMetrics fmReason(abortedReasonFont_);
+            reasonTxt=fmReason.elidedText(reasonTxt,Qt::ElideRight,220);
+            currentRight+=fmReason.width('A')/2+fmReason.width(reasonTxt);
+        }
+    }
+
+    return currentRight+1;
+}
+
+
+QString TreeNodeViewDelegate::formatTime(int timeInSec) const
+{
+    int h=timeInSec/3600;
+    int r=timeInSec%3600;
+    int m=r/60;
+    int s=r%60;
+
+    QTime t(h,m,s);
+    if(h > 0)
+        return t.toString("h:mm:ss");
+    else
+        return t.toString("m:ss");
+
+    return QString();
+}
+
+QColor TreeNodeViewDelegate::interpolate(QColor c1,QColor c2,float r) const
+{
+    return QColor::fromRgbF(c1.redF()+r*(c2.redF()-c1.redF()),
+                  c1.greenF()+r*(c2.greenF()-c1.greenF()),
+                  c1.blueF()+r*(c2.blueF()-c1.blueF()));
 }
diff --git a/Viewer/src/TreeNodeViewDelegate.hpp b/Viewer/src/TreeNodeViewDelegate.hpp
index 67bdf40..c17e81b 100644
--- a/Viewer/src/TreeNodeViewDelegate.hpp
+++ b/Viewer/src/TreeNodeViewDelegate.hpp
@@ -8,24 +8,97 @@
 //
 //============================================================================
 
-#ifndef TreeNodeViewDelegate_HPP_
-#define TreeNodeViewDelegate_HPP_
+#ifndef TREENODEVIEWDELEGATEBASE_HPP
+#define TREENODEVIEWDELEGATEBASE_HPP
 
-#include "TreeNodeViewDelegateBase.hpp"
+#include <QBrush>
+#include <QMap>
+#include <QPen>
+#include <QStyledItemDelegate>
 
-class TreeNodeViewDelegate : public TreeNodeViewDelegateBase
+#include "NodeViewDelegate.hpp"
+#include "VProperty.hpp"
+
+#include <string>
+
+class AnimationHandler;
+class PropertyMapper;
+class NodeShape;
+class NodeText;
+class ServerUpdateData;
+class TreeNodeModel;
+
+class TreeNodeViewDelegate : public NodeViewDelegate
 {
+Q_OBJECT
+
 public:
     explicit TreeNodeViewDelegate(TreeNodeModel* model,QWidget *parent=0);
-	~TreeNodeViewDelegate();
+    ~TreeNodeViewDelegate();
+
+    bool isSingleHeight(int h) const;
 
+    //from baseclass
     void paint(QPainter *painter,const QStyleOptionViewItem &option,
-                   const QModelIndex& index) const;
+                   const QModelIndex& index) const {}
+    QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex& index ) const;
+
+    //custom implementations
+    void paint(QPainter *painter,const QStyleOptionViewItem &option,
+                   const QModelIndex& index,QSize&) const;
+    void sizeHint(const QModelIndex& index,int& w,int& h) const;
+
+
+Q_SIGNALS:
+    void sizeHintChangedGlobal();
+
+protected:
+    void updateSettings();
+
+    int renderServer(QPainter *painter,const QModelIndex& index,
+                        const QStyleOptionViewItem& option,QString text) const;
+
+    int renderNode(QPainter *painter,const QModelIndex& index,
+                    const QStyleOptionViewItem& option,QString text) const;
+
+    void renderServerCell(QPainter *painter,const NodeShape& stateShape,
+                                            const NodeText& text,bool selected) const;
+
+    void renderNodeCell(QPainter *painter,const NodeShape& stateShape,const NodeShape &realShape,
+                       const NodeText& nodeText,const NodeText& typeText,bool selected) const;
+
+    void renderNodeShape(QPainter* painter,const NodeShape& shape) const;
+    void renderTimer(QPainter *painter,QRect target, int remaining, int total) const;
+    void renderServerUpdate(QPainter* painter,const ServerUpdateData&) const;
+
+    void widthHintServer(const QModelIndex& index,int& itemWidth,QString text) const;
+    int nodeWidth(const QModelIndex& index,QString text) const;
+
+    QString formatTime(int timeInSec) const;
+    QColor interpolate(QColor c1,QColor c2,float r) const;
+
+    enum NodeStyle {ClassicNodeStyle,BoxAndTextNodeStyle};
+
+    AnimationHandler* animation_;
+
+    int nodeRectRad_;
+    bool drawChildCount_;
+    NodeStyle nodeStyle_;
+
+    bool drawNodeType_;
+    QColor typeBgCol_;
+
+    QFont serverNumFont_;
+    QFont suiteNumFont_;
+    QFont serverInfoFont_;
+    QFont abortedReasonFont_;
+    QFont typeFont_;
+    QColor bgCol_;
 
-    QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex& index ) const;   
+    TreeNodeModel* model_;
 };
 
-#endif
+#endif // TREENODEVIEWDELEGATEBASE_HPP
 
 
 
diff --git a/Viewer/src/TreeNodeViewDelegateBase.cpp b/Viewer/src/TreeNodeViewDelegateBase.cpp
deleted file mode 100644
index f6a318a..0000000
--- a/Viewer/src/TreeNodeViewDelegateBase.cpp
+++ /dev/null
@@ -1,1128 +0,0 @@
-//============================================================================
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 "TreeNodeViewDelegateBase.hpp"
-
-#include <QApplication>
-#include <QDebug>
-#include <QImageReader>
-#include <QLinearGradient>
-#include <QPainter>
-
-#include "AbstractNodeModel.hpp"
-#include "Animation.hpp"
-#include "FontMetrics.hpp"
-#include "IconProvider.hpp"
-#include "Palette.hpp"
-#include "PropertyMapper.hpp"
-#include "ServerHandler.hpp"
-#include "TreeNodeModel.hpp"
-#include "UiLog.hpp"
-
-static std::vector<std::string> propVec;
-
-static QColor typeFgColourClassic=QColor(Qt::white);
-static QColor typeBgColourClassic=QColor(150,150,150);
-static QColor childCountColour=QColor(90,91,92);
-
-
-struct NodeShape
-{
-    QColor col_;
-    QPolygon shape_;
-};
-
-struct NodeText
-{
-    QColor fgCol_;
-    QColor bgCol_;
-    QRect br_;
-    QString text_;
-};
-
-struct ServerUpdateData
-{
-    QRect br_;
-    int prevTime_;
-    int nextTime_;
-    QString prevText_;
-    QString nextText_;
-    float prog_;
-};
-
-
-TreeNodeViewDelegateBase::TreeNodeViewDelegateBase(TreeNodeModel* model,QWidget *parent) :
-    nodeRectRad_(0),
-    drawChildCount_(true),
-    nodeStyle_(ClassicNodeStyle),
-    indentation_(0),
-    drawNodeType_(true),
-    bgCol_(Qt::white),
-    model_(model)
-{
-    drawAttrSelectionRect_=true;
-
-    attrFont_=font_;
-    attrFont_.setPointSize(8);
-    serverInfoFont_=font_;
-    suiteNumFont_=font_;
-    abortedReasonFont_=font_;
-    abortedReasonFont_.setBold(true);
-    typeFont_=font_;
-    typeFont_.setBold(true);
-    typeFont_.setPointSize(font_.pointSize()-1);
-
-    //Property
-    if(propVec.empty())
-    {
-        propVec.push_back("view.tree.nodeFont");
-        propVec.push_back("view.tree.attributeFont");
-        propVec.push_back("view.tree.display_child_count");
-        propVec.push_back("view.tree.displayNodeType");
-        propVec.push_back("view.tree.background");
-        propVec.push_back("view.common.node_style");
-
-        //Base settings
-        addBaseSettings(propVec);
-    }
-
-    prop_=new PropertyMapper(propVec,this);
-
-    //WARNING: updateSettings() cannot be called from here because
-    //nodeBox_ and attrBox_ are only created in the derived classes. So it muse be
-    //called from those derived classes.
-
-    //The parent must be the view!!!
-    animation_=new AnimationHandler(parent);
-}
-
-TreeNodeViewDelegateBase::~TreeNodeViewDelegateBase()
-{
-    delete animation_;
-}
-
-void TreeNodeViewDelegateBase::updateSettings()
-{
-    Q_ASSERT(nodeBox_);
-    Q_ASSERT(attrBox_);
-
-    if(VProperty* p=prop_->find("view.common.node_style"))
-    {
-        if(p->value().toString() == "classic")
-            nodeStyle_=ClassicNodeStyle;
-        else
-            nodeStyle_=BoxAndTextNodeStyle;
-    }
-    if(VProperty* p=prop_->find("view.tree.nodeRectRadius"))
-    {
-        nodeRectRad_=p->value().toInt();
-    }
-    if(VProperty* p=prop_->find("view.tree.nodeFont"))
-    {
-        QFont newFont=p->value().value<QFont>();
-
-        if(font_ != newFont )
-        {
-            font_=newFont;
-            nodeBox_->adjust(font_);
-            serverInfoFont_=font_;
-            serverNumFont_.setFamily(font_.family());
-            serverNumFont_.setPointSize(font_.pointSize()-1);
-            suiteNumFont_.setFamily(font_.family());
-            suiteNumFont_.setPointSize(font_.pointSize()-1);
-            abortedReasonFont_.setFamily(font_.family());
-            abortedReasonFont_.setPointSize(font_.pointSize());
-            typeFont_.setFamily(font_.family());
-            typeFont_.setPointSize(font_.pointSize()-1);
-
-            Q_EMIT sizeHintChangedGlobal();
-        }
-    }
-    if(VProperty* p=prop_->find("view.tree.attributeFont"))
-    {
-        QFont newFont=p->value().value<QFont>();
-
-        if(attrFont_ != newFont)
-        {
-            attrFont_=newFont;
-            attrBox_->adjust(attrFont_);
-            Q_EMIT sizeHintChangedGlobal();
-        }
-    }
-
-    if(VProperty* p=prop_->find("view.tree.display_child_count"))
-    {
-        drawChildCount_=p->value().toBool();
-    }
-
-    if(VProperty* p=prop_->find("view.tree.displayNodeType"))
-    {
-        drawNodeType_=p->value().toBool();
-    }
-
-    if(VProperty* p=prop_->find("view.tree.background"))
-    {
-        bgCol_=p->value().value<QColor>();
-    }
-
-    //Update the settings handled by the base class
-    updateBaseSettings();
-}
-
-
-int TreeNodeViewDelegateBase::renderServer(QPainter *painter,const QModelIndex& index,
-                                           const QStyleOptionViewItem& option,QString text) const
-{
-    ServerHandler* server=static_cast<ServerHandler*>(index.data(AbstractNodeModel::ServerPointerRole).value<void*>());
-    Q_ASSERT(server);
-
-    int totalWidth=0;
-    bool selected=option.state & QStyle::State_Selected;
-    //int offset=nodeBox_->leftMargin;
-    QFontMetrics fm(font_);
-
-    //The initial filled rect (we will adjust its  width)
-    QRect itemRect=option.rect.adjusted(nodeBox_->leftMargin,nodeBox_->topMargin,0,-nodeBox_->bottomMargin);
-
-#if 0
-    painter->setPen(QColor(190,190,190));
-    painter->drawLine(0,option.rect.y()+1,painter->device()->width(),option.rect.y()+1);
-    painter->drawLine(0,option.rect.bottom()-1,painter->device()->width(),option.rect.bottom()-1);
-#endif
-#if 0
-
-    QRect progRect(0,itemRect.y()-deltaH,painter->device()->width(),itemRect.height()+2*deltaH);
-    progRect.setWidth(painter->device()->width());
-    painter->setBrush(Qt::NoBrush);
-    painter->setPen(QColor(190,190,190));
-    painter->drawRect(progRect);
-    painter->setBrush(QColor(230,230,230));
-    painter->drawRect(progRect.adjusted(0,0,-progRect.width()*0.4,0));
-#endif
-
-    int currentRight=itemRect.x();
-
-    NodeShape stateShape;
-    stateShape.col_=index.data(Qt::BackgroundRole).value<QColor>();
-
-    NodeText nodeText;
-    nodeText.text_=text;
-    int textWidth=fm.width(text);
-
-    if(nodeStyle_ == BoxAndTextNodeStyle)
-    {
-        stateShape.shape_=QPolygon(QRect(itemRect.x(),itemRect.y(),itemRect.height(),itemRect.height()));
-        QRect shBr=stateShape.shape_.boundingRect();
-        currentRight=shBr.x()+shBr.width()+2;
-        nodeText.br_=QRect(currentRight,itemRect.y(),textWidth+nodeBox_->leftPadding, itemRect.height());
-        nodeText.fgCol_=QColor(Qt::black);
-        currentRight=nodeText.br_.x()+nodeText.br_.width();
-    }
-    else
-    {
-        stateShape.shape_=QPolygon(QRect(itemRect.x(),itemRect.y(),textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding,itemRect.height()));
-        nodeText.br_=QRect(itemRect.x()+nodeBox_->leftPadding,itemRect.y(),textWidth, itemRect.height());
-        nodeText.fgCol_=index.data(Qt::ForegroundRole).value<QColor>();
-        QRect shBr=stateShape.shape_.boundingRect();
-        currentRight=shBr.x()+shBr.width();;
-    }
-
-    //Refresh timer
-   /* bool hasTimer=true;
-    QRect timeRect(currentRight+offset,itemRect.y()-1,itemRect.height()+2,itemRect.height()+2);
-    currentRight=timeRect.right();*/
-
-    //Icons area
-    QList<QPixmap> pixLst;
-    QList<QRect> pixRectLst;
-
-    QVariant va=index.data(AbstractNodeModel::IconRole);
-    if(va.type() == QVariant::List)
-    {
-        QVariantList lst=va.toList();
-        if(lst.count() >0)
-        {
-            int xp=currentRight+nodeBox_->iconPreGap;
-            int yp=itemRect.center().y()+1-nodeBox_->iconSize/2;
-            for(int i=0; i < lst.count(); i++)
-            {
-                int id=lst[i].toInt();
-                if(id != -1)
-                {
-                    pixLst << IconProvider::pixmap(id,nodeBox_->iconSize);
-                    pixRectLst << QRect(xp,yp,nodeBox_->iconSize,nodeBox_->iconSize);
-                    xp+=nodeBox_->iconSize+nodeBox_->iconGap;
-                }
-            }
-
-            if(!pixLst.isEmpty())
-            {
-                currentRight=xp-nodeBox_->iconGap;
-            }
-        }
-    }
-
-    //The pixmap (optional)
-    bool hasPix=false;
-    QRect pixRect;
-
-    //The info rectangle (optional)
-    QRect infoRect;
-    QString infoTxt=index.data(AbstractNodeModel::InfoRole).toString();
-    bool hasInfo=(infoTxt.isEmpty() == false);
-
-    if(hasInfo)
-    {
-        //infoFont.setBold(true);
-        fm=QFontMetrics(serverInfoFont_);
-
-        int infoWidth=fm.width(infoTxt);
-        infoRect = nodeText.br_;
-        infoRect.setLeft(currentRight+fm.width('A'));
-        infoRect.setWidth(infoWidth);
-        currentRight=infoRect.x()+infoRect.width();
-    }
-
-    //The load icon (optional)
-    QRect loadRect;
-    bool hasLoad=index.data(AbstractNodeModel::LoadRole).toBool();
-    Animation* an=0;
-
-    //Update load animation
-    if(hasLoad)
-    {
-        an=animation_->find(Animation::ServerLoadType,true);
-
-        loadRect = QRect(currentRight+fm.width('A'),
-                        itemRect.top()+(itemRect.height()-an->scaledSize().height())/2,
-                        an->scaledSize().width(),
-                        an->scaledSize().height());
-
-        currentRight=loadRect.x()+loadRect.width();
-
-        //Add this index to the animations
-        //There is no guarantee that this index will be valid in the future!!!
-        an->addTarget(server->vRoot());
-    }
-    //Stops load animation
-    else
-    {
-        if((an=animation_->find(Animation::ServerLoadType,false)) != NULL)
-            an->removeTarget(server->vRoot());
-    }
-
-    //The node number (optional)
-    QRect numRect;
-    QString numTxt;
-    bool hasNum=false;
-
-    if(drawChildCount_)
-    {
-        QVariant va=index.data(AbstractNodeModel::NodeNumRole);
-        hasNum=(va.isNull() == false);
-        if(hasNum)
-        {
-            numTxt="(" + QString::number(va.toInt()) + ")";
-
-            QFontMetrics fmNum(serverNumFont_);
-
-            int numWidth=fmNum.width(numTxt);
-            numRect = nodeText.br_;
-            numRect.setLeft(currentRight+fmNum.width('A')/2);
-            numRect.setWidth(numWidth);
-            currentRight=numRect.x()+numRect.width();
-        }
-    }
-
-    //Update
-    bool hasUpdate=false;
-    ServerUpdateData updateData;
-#if 0
-    if(server)
-    {
-        hasUpdate=true;
-        updateData.br_=QRect(currentRight+3*offset,itemRect.y()-1,0,itemRect.height()+2);
-        updateData.prevTime_=server->secsSinceLastRefresh();
-        updateData.nextTime_=server->secsTillNextRefresh();
-        if(updateData.prevTime_ >=0)
-        {
-            if(updateData.nextTime_ >=0)
-            {
-                updateData.prevText_="-" + formatTime(updateData.prevTime_);
-                updateData.nextText_="+" +formatTime(updateData.nextTime_);
-                updateData.prog_=(static_cast<float>(updateData.prevTime_)/static_cast<float>(updateData.prevTime_+updateData.nextTime_));
-                updateData.br_.setWidth(fm.width("ABCDE")+fm.width(updateData.prevText_)+fm.width(updateData.nextText_)+2*offset);
-            }
-            else
-            {
-                updateData.prevText_="last update: " + formatTime(updateData.prevTime_);
-                updateData.prog_=0;
-                updateData.br_.setWidth(fm.width(updateData.prevText_));
-            }
-            currentRight=updateData.br_.right();
-         }
-        else
-        {
-            hasUpdate=false;
-        }
-    }
-#endif
-
-    //Define clipping
-    int rightPos=currentRight+1;
-    totalWidth=rightPos-option.rect.left();
-    const bool setClipRect = rightPos > option.rect.right();
-    if(setClipRect)
-    {
-        painter->save();
-        painter->setClipRect(option.rect);
-    }
-
-    //Draw state/node rect
-    renderServerCell(painter,stateShape,nodeText,selected);
-
-    //Draw timer
-    /*int remaining=6*60*1000; //   server->remainingTimeToRefresh();
-    int total=10*60*1000; //server->refreshPeriod() ;
-    renderTimer(painter,timeRect,remaining,total);*/
-
-    //Draw icons
-    for(int i=0; i < pixLst.count(); i++)
-    {
-        painter->drawPixmap(pixRectLst[i],pixLst[i]);
-    }
-
-    //Draw pixmap if needed
-    if(hasPix)
-    {
-        painter->drawPixmap(pixRect,errPix_);
-    }
-
-    //Draw info
-    if(hasInfo)
-    {
-        painter->setPen(Qt::black);
-        painter->setFont(serverInfoFont_);
-        painter->drawText(infoRect,Qt::AlignLeft | Qt::AlignVCenter,infoTxt);
-    }
-
-    //Draw number
-    if(hasNum)
-    {
-        painter->setPen(childCountColour);
-        painter->setFont(serverNumFont_);
-        painter->drawText(numRect,Qt::AlignLeft | Qt::AlignVCenter,numTxt);
-    }
-
-    //Draw load animation
-    if(hasLoad)
-    {
-        Animation* an=animation_->find(Animation::ServerLoadType,false);
-        if(an)
-        {
-            painter->drawPixmap(loadRect,an->currentPixmap());
-        }
-    }
-#if 0
-    if(hasUpdate)
-    {
-        renderServerUpdate(painter,updateData);
-    }
-#endif
-    if(setClipRect)
-    {
-        painter->restore();
-    }
-
-    return totalWidth;
-}
-
-int TreeNodeViewDelegateBase::renderNode(QPainter *painter,const QModelIndex& index,
-                                    const QStyleOptionViewItem& option,QString text) const
-{
-    int totalWidth=0;
-    bool selected=option.state & QStyle::State_Selected;
-    QFontMetrics fm(font_);
-
-    //The initial filled rect (we will adjust its  width)
-    QRect itemRect=option.rect.adjusted(nodeBox_->leftMargin,nodeBox_->topMargin,0,-nodeBox_->bottomMargin);
-
-    NodeShape stateShape;
-    NodeShape realShape;
-    NodeText  nodeText;
-    NodeText  typeText;
-
-    //get the colours
-    QVariant bgVa=index.data(Qt::BackgroundRole);
-    bool hasRealBg=false;
-    if(bgVa.type() == QVariant::List)
-    {
-        QVariantList lst=bgVa.toList();
-        if(lst.count() ==  2)
-        {
-            hasRealBg=true;
-            stateShape.col_=lst[0].value<QColor>();
-            realShape.col_=lst[1].value<QColor>();
-        }
-    }
-    else
-    {
-        stateShape.col_=bgVa.value<QColor>();
-    }
-
-    int currentRight=itemRect.x();
-
-    //Node type
-    QFontMetrics fmType(typeFont_);
-    int typeWidth=fmType.width(" S");
-
-    if(drawNodeType_)
-    {
-        int nodeType=index.data(AbstractNodeModel::NodeTypeRole).toInt();
-        switch(nodeType)
-        {
-        case 0: typeText.text_="S"; break;
-        case 1: typeText.text_="F"; break;
-        case 2: typeText.text_="T"; break;
-        case 3: typeText.text_="A"; break;
-        default: break;
-        }
-    }
-
-    //The text rectangle
-    nodeText.text_=text;
-    int textWidth=fm.width(text);
-
-    if(nodeStyle_ == BoxAndTextNodeStyle)
-    {
-        int realW=itemRect.height()/4;
-
-        QRect r1(currentRight,itemRect.y(),itemRect.height(),itemRect.height());
-        if(hasRealBg)
-            r1.adjust(0,0,-realW,0);
-
-        stateShape.shape_=QPolygon(r1);
-
-        if(hasRealBg)
-        {
-            QRect r2(r1.x()+r1.width(),r1.top(),realW+1,r1.height());
-            realShape.shape_=QPolygon(r2);
-            currentRight=r2.x()+r2.width()+2;
-        }
-        else
-            currentRight=r1.x()+r1.width()+2;
-
-        if(drawNodeType_)
-        {
-            typeText.br_=r1;
-            typeText.fgCol_=index.data(AbstractNodeModel::NodeTypeForegroundRole).value<QColor>();
-        }
-
-        nodeText.br_=QRect(currentRight,r1.top(),textWidth+nodeBox_->leftPadding,r1.height());
-        nodeText.fgCol_=QColor(Qt::black);
-        currentRight=nodeText.br_.x() + nodeText.br_.width();
-
-#if 0
-        if(nodeStyle_ == BoxAndTextNodeStyle)
-        {
-            int realW=itemRect.height()/4;
-
-            //state box
-            currentRight+=itemRect.height();
-            if(hasRealBg)
-            {
-                currentRight+=1;
-            }
-            currentRight+=2;
-
-            //node name
-            currentRight+=textWidth+nodeBox_->leftPadding;
-        }
-#endif
-
-    }
-    //Classic style
-    else
-    {
-        if(drawNodeType_)
-        {
-            typeText.br_=QRect(currentRight,itemRect.y(),typeWidth,itemRect.height());
-            typeText.fgCol_=typeFgColourClassic;
-            typeText.bgCol_=typeBgColourClassic;
-            currentRight=typeText.br_.x()+typeText.br_.width()+2;
-        }
-
-        QRect r1(currentRight,itemRect.y(),textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding,itemRect.height());
-        stateShape.shape_=QPolygon(r1);
-        currentRight=r1.x()+r1.width();
-
-        nodeText.br_=QRect(r1.left()+nodeBox_->leftPadding,r1.top(),textWidth,r1.height());
-        nodeText.fgCol_=index.data(Qt::ForegroundRole).value<QColor>();
-
-        if(hasRealBg)
-        {
-            int realW=6;
-            QRect r2(r1.x()+r1.width(),r1.top(),realW+1,r1.height());
-            realShape.shape_=QPolygon(r2);
-            currentRight=r2.x()+r2.width();
-        }
-    }
-
-    //Icons area
-    QList<QPixmap> pixLst;
-    QList<QRect> pixRectLst;
-
-    QVariant va=index.data(AbstractNodeModel::IconRole);
-    if(va.type() == QVariant::List)
-    {
-        QVariantList lst=va.toList();
-        if(lst.count() >0)
-        {
-            int xp=currentRight+nodeBox_->iconPreGap;
-            int yp=itemRect.center().y()+1-nodeBox_->iconSize/2;
-            for(int i=0; i < lst.count(); i++)
-            {
-                int id=lst[i].toInt();
-                if(id != -1)
-                {
-                    pixLst << IconProvider::pixmap(id,nodeBox_->iconSize);
-                    pixRectLst << QRect(xp,yp,nodeBox_->iconSize,nodeBox_->iconSize);
-                    xp+=nodeBox_->iconSize+nodeBox_->iconGap;
-                }
-            }
-
-            if(!pixLst.isEmpty())
-            {
-                currentRight=xp-nodeBox_->iconGap;
-            }
-        }
-    }
-
-    //The node number (optional)
-    QRect numRect;
-    QString numTxt;
-    bool hasNum=false;
-
-    if(drawChildCount_)
-    {
-        va=index.data(AbstractNodeModel::NodeNumRole);
-        hasNum=(va.isNull() == false);
-
-        if(hasNum)
-        {
-            numTxt="(" + va.toString() + ")";
-            QFontMetrics fmNum(suiteNumFont_);
-
-            int numWidth=fmNum.width(numTxt);
-            numRect = nodeText.br_;
-            numRect.setLeft(currentRight+fmNum.width('A')/2);
-            numRect.setWidth(numWidth);
-            currentRight=numRect.x()+numRect.width();
-        }
-    }
-
-    //The aborted reason
-    QRect reasonRect;
-    QString reasonTxt=index.data(AbstractNodeModel::AbortedReasonRole).toString();
-    if(reasonTxt.contains('\n'))
-        reasonTxt=reasonTxt.split("\n").first();
-
-    bool hasReason=(!reasonTxt.isEmpty());
-    if(hasReason)
-    {
-        QFontMetrics fmReason(abortedReasonFont_);
-        reasonRect = nodeText.br_;
-        reasonRect.setLeft(currentRight+fmReason.width('A')/2);
-        reasonTxt=fmReason.elidedText(reasonTxt,Qt::ElideRight,220);
-        reasonRect.setWidth(fmReason.width(reasonTxt));
-        currentRight=reasonRect.x()+reasonRect.width();
-    }
-
-    //Define clipping
-    int rightPos=currentRight+1;
-    totalWidth=rightPos-option.rect.left();
-
-#if 0
-    const bool setClipRect = rightPos > option.rect.right();
-    if(setClipRect)
-    {
-        painter->save();
-        painter->setClipRect(option.rect);
-    }
-#endif
-
-
-    renderNodeCell(painter,stateShape,realShape,nodeText,typeText,selected);
-
-    //Draw icons
-    for(int i=0; i < pixLst.count(); i++)
-    {
-        //painter->fillRect(pixRectLst[i],Qt::black);
-        painter->drawPixmap(pixRectLst[i],pixLst[i]);
-    }
-
-    //Draw number
-    if(hasNum)
-    {
-        painter->setPen(childCountColour);
-        painter->setFont(suiteNumFont_);
-        painter->drawText(numRect,Qt::AlignLeft | Qt::AlignVCenter,numTxt);
-    }
-
-    //Draw aborted reason
-    if(hasReason)
-    {
-        painter->setPen(stateShape.col_.darker(120));
-        painter->setFont(abortedReasonFont_);
-        painter->drawText(reasonRect,Qt::AlignLeft | Qt::AlignVCenter,reasonTxt);
-    }
-#if 0
-    if(setClipRect)
-    {
-        painter->restore();
-    }
-#endif
-    return totalWidth;
-}
-
-void TreeNodeViewDelegateBase::renderServerCell(QPainter *painter,const NodeShape& stateShape,
-                                        const NodeText& text,bool selected) const
-{
-    renderNodeShape(painter,stateShape);
-
-    //Draw text
-    painter->setFont(font_);
-    painter->setPen(QPen(text.fgCol_,0));
-    painter->drawText(text.br_,Qt::AlignHCenter | Qt::AlignVCenter,text.text_);
-
-    //selection
-    painter->setPen(nodeSelectPen_);
-    painter->setBrush(Qt::NoBrush);
-    QPolygon sel=stateShape.shape_;
-
-    if(selected)
-    {
-        if(nodeStyle_ == BoxAndTextNodeStyle)
-        {
-            sel=sel.united(QPolygon(text.br_.adjusted(0,0,2,0)));
-        }
-        painter->drawRect(sel.boundingRect());
-    }
-}
-
-void TreeNodeViewDelegateBase::renderNodeCell(QPainter *painter,const NodeShape& stateShape,const NodeShape &realShape,
-                             const NodeText& nodeText,const NodeText& typeText,bool selected) const
-{
-    renderNodeShape(painter,stateShape);
-    renderNodeShape(painter,realShape);
-
-    //Draw type
-    if(drawNodeType_)
-    {
-        if(typeText.bgCol_.isValid())
-        {
-            //painter->fillRect(typeText.br_,typeText.bgCol_);
-            painter->setBrush(typeText.bgCol_);
-            painter->setPen(typeText.bgCol_);
-            painter->drawRect(typeText.br_);
-        }
-        painter->setFont(typeFont_);
-        painter->setPen(typeText.fgCol_);
-        painter->setBrush(Qt::NoBrush);
-        painter->drawText(typeText.br_,Qt::AlignCenter,typeText.text_);
-   }
-
-    //Draw text
-    painter->setFont(font_);
-    painter->setPen(QPen(nodeText.fgCol_,0));
-    painter->drawText(nodeBox_->adjustTextRect(nodeText.br_),Qt::AlignHCenter | Qt::AlignVCenter,nodeText.text_);
-
-    //selection
-    painter->setPen(nodeSelectPen_);
-    painter->setBrush(Qt::NoBrush);
-    QPolygon sel=stateShape.shape_;
-
-    if(selected)
-    {
-        if(nodeStyle_ == BoxAndTextNodeStyle)
-        {
-            if(!realShape.shape_.isEmpty())
-                sel=sel.united(realShape.shape_);
-
-            sel=sel.united(QPolygon(nodeText.br_.adjusted(0,0,0,0)));
-        }
-        else
-        {
-            if(!realShape.shape_.isEmpty())
-                sel=sel.united(realShape.shape_);
-        }
-        painter->drawRect(sel.boundingRect());
-    }
-
-   /*
-
-        if(nodeStyle_ == BoxAndTextNodeStyle)
-        {
-            painter->setFont(typeFont_);
-            painter->setPen();
-            painter->drawText(typeText.br_,Qt::AlignCenter,typeText.text_);
-        }
-        else
-        {
-            painter->setPen(Qt::NoPen);
-
-            if(typeTxt == "S")
-                painter->setBrush(QColor(150,150,150)); //bgBrush);
-            else if(typeTxt == "F")
-                painter->setBrush(QColor(150,150,150)); //bgBrush);
-            else
-                painter->setBrush(QColor(190,190,190)); //bgBrush);
-
-            painter->drawRect(typeRect);
-
-            painter->setPen(Qt::white);
-            painter->setFont(typeFont_);
-            painter->drawText(typeRect,Qt::AlignCenter,typeTxt);
-         }
-    }
-
-    //Draw text
-    painter->setFont(font_);
-    painter->setPen(QPen(fg,0));
-    painter->drawText(textRect,Qt::AlignLeft | Qt::AlignVCenter,text);
-
-    //selection
-    painter->setPen(nodeSelectPen_);
-    painter->setBrush(Qt::NoBrush);
-    QPolygon sel=stateShape.shape_;
-
-    if(selected)
-    {
-        if(nodeStyle_ == BoxAndTextNodeStyle)
-        {
-            if(!realShape.shape_.isEmpty())
-                sel=sel.united(realShape.shape_);
-
-            sel=sel.united(QPolygon(textRect.adjusted(0,0,2,0)));
-        }
-        else
-        {
-            if(!realShape.shape_.isEmpty())
-                sel=sel.united(realShape.shape_);
-        }
-        painter->drawRect(sel.boundingRect());
-        //painter->drawPolygon(sel);
-    }
-*/
-    //painter->setRenderHints(QPainter::Antialiasing,false);
-}
-
-
-void TreeNodeViewDelegateBase::renderNodeShape(QPainter* painter,const NodeShape& shape) const
-{
-    if(shape.shape_.isEmpty())
-        return;
-
-    QColor bg=shape.col_;
-    QColor bgLight, borderCol;
-    Palette::statusColours(bg,bgLight,borderCol);
-
-    QBrush bgBrush;
-    if(useStateGrad_)
-    {
-        grad_.setColorAt(0,bgLight);
-        grad_.setColorAt(1,bg);
-        bgBrush=QBrush(grad_);
-    }
-    else
-        bgBrush=QBrush(bg);
-
-    //Fill  shape
-    painter->setPen(borderCol);
-    painter->setBrush(bgBrush);
-    painter->drawPolygon(shape.shape_);
-}
-
-void TreeNodeViewDelegateBase::renderTimer(QPainter *painter,QRect target,int remaining, int total) const
-{
-    QImage img(target.width(),target.height(),QImage::Format_ARGB32_Premultiplied);
-    QRect r=img.rect().adjusted(2,2,-2,-2);
-    img.fill(Qt::transparent);
-    QPainter p(&img);
-    p.setRenderHint(QPainter::Antialiasing,true);
-
-    int angle=static_cast<int>(360.*static_cast<float>(total-remaining)/static_cast<float>(total));
-    /*angle-=90.;
-    if(angle >=0 && angle <= 90) angle=90-angle;
-    else
-       angle=450-angle;*/
-
-    QColor c(43,97,158);
-
-    QBrush b(c);
-    p.setBrush(b);
-    p.setPen(c);
-    p.drawPie(r,90*16,-angle*16);
-    p.setBrush(Qt::NoBrush);
-    p.drawEllipse(r);
-
-    painter->drawImage(target,img,img.rect());
-}
-
-
-void TreeNodeViewDelegateBase::renderServerUpdate(QPainter* painter,const ServerUpdateData& data) const
-{
-    QFont font(font_);
-    font.setPointSize(font_.pointSize()-1);
-    QFontMetrics fm(font);
-    painter->setFont(font);
-    painter->setPen(Qt::black);
-
-    QColor minCol=QColor(198,215,253);
-    QColor maxCol=QColor(43,97,158);
-
-    QRect r1=data.br_;
-    r1.setWidth(fm.width(data.prevText_));
-    painter->setPen(minCol);
-    //painter->setPen(Qt::red);
-    painter->drawText(r1,Qt::AlignLeft | Qt::AlignVCenter,data.prevText_);
-
-    if(!data.prevText_.isEmpty())
-    {
-        QRect r2=data.br_;
-        r2.setX(data.br_.right()-fm.width(data.nextText_));
-        //painter->setPen(QColor(1,128,73));
-        painter->setPen(maxCol);
-        painter->drawText(r2,Qt::AlignRight | Qt::AlignVCenter,data.nextText_);
-
-        int dh=(data.br_.height()-fm.height()+1)/2;
-        QRect r=data.br_.adjusted(r1.width()+4,2*dh,-r2.width()-4,-2*dh);
-
-        int pos=static_cast<int>(data.prog_* r.width());
-        QRect rPrev=r.adjusted(0,0,-(r.width()-pos),0);
-
-        QLinearGradient grad;
-        grad.setCoordinateMode(QGradient::ObjectBoundingMode);
-        grad.setStart(0,0);
-        grad.setFinalStop(1,0);
-        QColor posCol=interpolate(minCol,maxCol,data.prog_);
-
-        grad.setColorAt(0,minCol);
-        grad.setColorAt(1,posCol);
-        painter->setPen(Qt::NoPen);
-        painter->setBrush(grad);
-        painter->drawRect(rPrev);
-
-        painter->setBrush(Qt::NoBrush);
-        painter->setPen(QColor(190,190,190));
-        painter->drawRect(r);
-    }
-}
-
-void TreeNodeViewDelegateBase::widthHintServer(const QModelIndex& index,int& itemWidth, QString text) const
-{
-    ServerHandler* server=static_cast<ServerHandler*>(index.data(AbstractNodeModel::ServerPointerRole).value<void*>());
-    Q_ASSERT(server);
-
-    QFontMetrics fm(font_);
-
-    //The initial filled rect. We only care of the width
-    QRect itemRect(nodeBox_->leftMargin,0,10,10);
-    int currentRight=itemRect.left();
-
-    NodeShape stateShape;
-
-    NodeText nodeText;
-    nodeText.text_=text;
-    int textWidth=fm.width(text);
-
-    if(nodeStyle_ == BoxAndTextNodeStyle)
-    {
-        currentRight+=2+textWidth+nodeBox_->leftPadding;
-    }
-    else
-    {
-        currentRight+=textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding;
-    }
-
-    //Icons area
-    int pixNum=model_->iconNum(server->vRoot());
-    if(pixNum > 0)
-    {
-        currentRight+=nodeBox_->iconPreGap+pixNum*nodeBox_->iconSize + (pixNum-1)*nodeBox_->iconGap;
-    }
-
-    //The info rectangle (optional)
-    QString infoTxt=index.data(AbstractNodeModel::InfoRole).toString();
-    bool hasInfo=(infoTxt.isEmpty() == false);
-
-    if(hasInfo)
-    {
-        fm=QFontMetrics(serverInfoFont_);
-        int infoWidth=fm.width(infoTxt);
-        currentRight+=fm.width('A')+infoWidth;
-    }
-
-    //The load icon (optional)
-    bool hasLoad=index.data(AbstractNodeModel::LoadRole).toBool();
-    Animation* an=0;
-
-    //Update load animation
-    if(hasLoad)
-    {
-        an=animation_->find(Animation::ServerLoadType,true);
-        currentRight+=fm.width('A')+an->scaledSize().width();
-    }
-    //Stops load animation
-    else
-    {
-        //if((an=animation_->find(Animation::ServerLoadType,false)) != NULL)
-        //    an->removeTarget(server->vRoot());
-    }
-
-    //The node number (optional)
-    QString numTxt;
-    bool hasNum=false;
-
-    if(drawChildCount_)
-    {
-        QVariant va=index.data(AbstractNodeModel::NodeNumRole);
-        hasNum=(va.isNull() == false);
-        if(hasNum)
-        {
-            numTxt="(" + QString::number(va.toInt()) + ")";
-            QFontMetrics fmNum(serverNumFont_);
-            int numWidth=fmNum.width(numTxt);
-            currentRight+=fmNum.width('A')/2+numWidth;
-        }
-    }
-
-    itemWidth=currentRight+1;
-}
-
-int TreeNodeViewDelegateBase::nodeWidth(const QModelIndex& index,QString text) const
-{
-    VNode* node=static_cast<VNode*>(index.data(AbstractNodeModel::NodePointerRole).value<void*>());
-    Q_ASSERT(node);
-
-    int offset=nodeBox_->leftMargin;
-    QFontMetrics fm(font_);
-
-    //The initial filled rect. We only care about the width!
-    QRect itemRect(offset,0,10,10);
-    int currentRight=itemRect.left();
-
-    bool hasRealBg=node->isSuspended();
-
-    //Node type
-    QFontMetrics fmType(typeFont_);
-    int typeWidth=fmType.width(" S");
-
-    //The text rectangle
-    int textWidth=fm.width(text);
-
-    if(nodeStyle_ == BoxAndTextNodeStyle)
-    {
-        int realW=itemRect.height()/4;
-
-        //state box
-        currentRight+=itemRect.height();
-        if(hasRealBg)
-        {
-            currentRight+=1;
-        }
-        currentRight+=2;
-
-        //node name
-        currentRight+=textWidth+nodeBox_->leftPadding;
-    }
-    //Classic style
-    else
-    {
-        //node type box
-        if(drawNodeType_)
-        {
-            currentRight+=typeWidth+2;
-        }
-
-        //node name + state
-        currentRight+=textWidth+nodeBox_->leftPadding+nodeBox_->rightPadding;
-
-        if(hasRealBg)
-        {
-            int realW=6;
-            currentRight+=realW+1;
-        }
-    }
-
-    //Icons area
-    int pixNum=model_->iconNum(node);
-    if(pixNum > 0)
-    {
-        currentRight+=nodeBox_->iconPreGap+pixNum*nodeBox_->iconSize + (pixNum-1)*nodeBox_->iconGap;
-    }
-
-    //The node number (optional)
-    if(drawChildCount_)
-    {
-        if(node->isTopLevel())
-        {
-            QVariant va=index.data(AbstractNodeModel::NodeNumRole);
-            if(va.isNull() == false)
-            {
-                QString numTxt="(" + va.toString() + ")";
-                QFontMetrics fmNum(suiteNumFont_);
-                int numWidth=fmNum.width(numTxt);
-                currentRight+=fmNum.width('A')/2+numWidth;
-            }
-        }
-    }
-
-    //The aborted reason
-    if(node->isAborted())
-    {
-        QString reasonTxt=QString::fromStdString(node->abortedReason());
-        if(reasonTxt.contains('\n'))
-            reasonTxt=reasonTxt.split("\n").first();
-
-        bool hasReason=(!reasonTxt.isEmpty());
-        if(hasReason)
-        {
-            QFontMetrics fmReason(abortedReasonFont_);
-            reasonTxt=fmReason.elidedText(reasonTxt,Qt::ElideRight,220);
-            currentRight+=fmReason.width('A')/2+fmReason.width(reasonTxt);
-        }
-    }
-
-    return currentRight+1;
-}
-
-
-QString TreeNodeViewDelegateBase::formatTime(int timeInSec) const
-{
-    int h=timeInSec/3600;
-    int r=timeInSec%3600;
-    int m=r/60;
-    int s=r%60;
-
-    QTime t(h,m,s);
-    if(h > 0)
-        return t.toString("h:mm:ss");
-    else
-        return t.toString("m:ss");
-
-    return QString();
-}
-
-QColor TreeNodeViewDelegateBase::interpolate(QColor c1,QColor c2,float r) const
-{
-    return QColor::fromRgbF(c1.redF()+r*(c2.redF()-c1.redF()),
-                  c1.greenF()+r*(c2.greenF()-c1.greenF()),
-                  c1.blueF()+r*(c2.blueF()-c1.blueF()));
-}
diff --git a/Viewer/src/TreeNodeViewDelegateBase.hpp b/Viewer/src/TreeNodeViewDelegateBase.hpp
deleted file mode 100644
index b9078c8..0000000
--- a/Viewer/src/TreeNodeViewDelegateBase.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-//============================================================================
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 TREENODEVIEWDELEGATEBASE_HPP
-#define TREENODEVIEWDELEGATEBASE_HPP
-
-#include <QBrush>
-#include <QMap>
-#include <QPen>
-#include <QStyledItemDelegate>
-
-#include "NodeViewDelegate.hpp"
-#include "VProperty.hpp"
-
-#include <string>
-
-class AnimationHandler;
-class PropertyMapper;
-class NodeShape;
-class NodeText;
-class ServerUpdateData;
-class TreeNodeModel;
-
-class TreeNodeViewDelegateBase : public NodeViewDelegate
-{
-Q_OBJECT
-
-public:
-    explicit TreeNodeViewDelegateBase(TreeNodeModel* model,QWidget *parent=0);
-    ~TreeNodeViewDelegateBase();
-
-    void setIndentation(int o) {indentation_=o;}
-
-Q_SIGNALS:
-    void sizeHintChangedGlobal();
-
-protected:
-    void updateSettings();
-
-    int renderServer(QPainter *painter,const QModelIndex& index,
-                        const QStyleOptionViewItem& option,QString text) const;
-
-    int renderNode(QPainter *painter,const QModelIndex& index,
-                    const QStyleOptionViewItem& option,QString text) const;
-
-    void renderServerCell(QPainter *painter,const NodeShape& stateShape,
-                                            const NodeText& text,bool selected) const;
-
-    void renderNodeCell(QPainter *painter,const NodeShape& stateShape,const NodeShape &realShape,
-                       const NodeText& nodeText,const NodeText& typeText,bool selected) const;
-
-    void renderNodeShape(QPainter* painter,const NodeShape& shape) const;
-    void renderTimer(QPainter *painter,QRect target, int remaining, int total) const;
-    void renderServerUpdate(QPainter* painter,const ServerUpdateData&) const;
-
-    void widthHintServer(const QModelIndex& index,int& itemWidth,QString text) const;
-    int nodeWidth(const QModelIndex& index,QString text) const;
-
-    QString formatTime(int timeInSec) const;
-    QColor interpolate(QColor c1,QColor c2,float r) const;
-
-    enum NodeStyle {ClassicNodeStyle,BoxAndTextNodeStyle};
-
-    AnimationHandler* animation_;
-
-    int nodeRectRad_;
-    bool drawChildCount_;
-    NodeStyle nodeStyle_;
-    int indentation_;
-
-    bool drawNodeType_;
-    QColor typeBgCol_;
-
-    QFont serverNumFont_;
-    QFont suiteNumFont_;
-    QFont serverInfoFont_;
-    QFont abortedReasonFont_;
-    QFont typeFont_;
-    QColor bgCol_;
-
-    TreeNodeModel* model_;
-};
-
-#endif // TREENODEVIEWDELEGATEBASE_HPP
-
-
-
diff --git a/Viewer/src/TreeNodeWidget.cpp b/Viewer/src/TreeNodeWidget.cpp
index 35cc7bf..f17af4a 100644
--- a/Viewer/src/TreeNodeWidget.cpp
+++ b/Viewer/src/TreeNodeWidget.cpp
@@ -1,3 +1,4 @@
+
 /***************************** LICENSE START ***********************************
 
  Copyright 2009-2017 ECMWF and INPE. This software is distributed under the terms
@@ -13,7 +14,8 @@
 
 #include "AbstractNodeModel.hpp"
 #include "DashboardDock.hpp"
-#include "CompactNodeView.hpp"
+#include "CompactView.hpp"
+#include "StandardView.hpp"
 #include "NodePathWidget.hpp"
 #include "NodeViewBase.hpp"
 #include "TreeNodeModel.hpp"
@@ -30,8 +32,8 @@ AttributeFilter* TreeNodeWidget::lastAtts_=NULL;
 
 TreeNodeWidget::TreeNodeWidget(ServerFilter* serverFilter,QWidget* parent) :
     NodeWidget("tree",serverFilter,parent),
-    layoutProp_(0),
-    viewLayoutMode_(StandardLayoutMode)
+    viewLayoutMode_(StandardLayoutMode),
+    layoutProp_(0)
 {
 	//Init qt-creator form
 	setupUi(this);
@@ -109,49 +111,49 @@ void TreeNodeWidget::setViewLayoutMode(TreeNodeWidget::ViewLayoutMode mode)
 
     if(viewLayoutMode_ == CompactLayoutMode)
     {
-        CompactNodeView* gv=new CompactNodeView((TreeNodeModel*)model_,filterDef_,this);
-        viewHolder_->layout()->addWidget(gv);
+        TreeNodeModel* realModel=static_cast<TreeNodeModel*>(model_);
+
+        TreeNodeView* gv=new TreeNodeView(new CompactView(realModel,this),
+                                          realModel,filterDef_,this);
+        viewHolder_->layout()->addWidget(gv->realWidget());
         //Store the pointer to the (non-QObject) base class of the view!!!
         view_=gv;
     }
     else
     {
-        TreeNodeView *tv=new TreeNodeView((TreeNodeModel*)model_,filterDef_,this);
-        viewHolder_->layout()->addWidget(tv);
+        TreeNodeModel* realModel=static_cast<TreeNodeModel*>(model_);
+
+        TreeNodeView *tv=new TreeNodeView(new StandardView(realModel,this),
+                                          realModel,filterDef_,this);
+        viewHolder_->layout()->addWidget(tv->realWidget());
         //Store the pointer to the (non-QObject) base class of the view!!!
         view_=tv;
     }
 
     //Signals-slots
-    connect(view_->realWidget(),SIGNAL(selectionChanged(VInfo_ptr)),
+    connect(view_->realObject(),SIGNAL(selectionChanged(VInfo_ptr)),
         this,SLOT(slotSelectionChangedInView(VInfo_ptr)));
 
-    connect(view_->realWidget(),SIGNAL(infoPanelCommand(VInfo_ptr,QString)),
+    connect(view_->realObject(),SIGNAL(infoPanelCommand(VInfo_ptr,QString)),
         this,SIGNAL(popInfoPanel(VInfo_ptr,QString)));
 
-    connect(view_->realWidget(),SIGNAL(dashboardCommand(VInfo_ptr,QString)),
+    connect(view_->realObject(),SIGNAL(dashboardCommand(VInfo_ptr,QString)),
         this,SIGNAL(dashboardCommand(VInfo_ptr,QString)));
 
     connect(model_,SIGNAL(clearBegun(const VTreeNode*)),
-        view_->realWidget(),SLOT(slotSaveExpand(const VTreeNode*)));
+        view_->realObject(),SLOT(slotSaveExpand(const VTreeNode*)));
 
     connect(model_,SIGNAL(scanEnded(const VTreeNode*)),
-        view_->realWidget(),SLOT(slotRestoreExpand(const VTreeNode*)));
+        view_->realObject(),SLOT(slotRestoreExpand(const VTreeNode*)));
 
     connect(model_,SIGNAL(rerender()),
-        view_->realWidget(),SLOT(slotRerender()));
-
-    connect(model_,SIGNAL(filterChangeBegun()),
-        view_->realWidget(),SLOT(slotSaveExpand()));
-
-    connect(model_,SIGNAL(filterChangeEnded()),
-        view_->realWidget(),SLOT(slotRestoreExpand()));
+        view_->realObject(),SLOT(slotRerender()));
 
     connect(model_,SIGNAL(filterUpdateRemoveBegun(const VTreeNode*)),
-        view_->realWidget(),SLOT(slotSaveExpand(const VTreeNode*)));
+        view_->realObject(),SLOT(slotSaveExpand(const VTreeNode*)));
 
     connect(model_,SIGNAL(filterUpdateAddEnded(const VTreeNode*)),
-        view_->realWidget(),SLOT(slotRestoreExpand(const VTreeNode*)));
+        view_->realObject(),SLOT(slotRestoreExpand(const VTreeNode*)));
 
 }
 
@@ -159,7 +161,7 @@ void TreeNodeWidget::initAtts()
 {
 	if(VProperty *prop=VConfig::instance()->find("view.tree.attributesPolicy"))
 	{
-		if(prop->valueAsString() == "last")
+        if(prop->valueAsStdString() == "last")
 		{
 			atts_->setCurrent(lastAtts_->current());
 		}
@@ -202,7 +204,7 @@ void TreeNodeWidget::populateDockTitleBar(DashboardDockTitleWidget* tw)
 
     QAction* acState=new QAction(this);
     acState->setIcon(QPixmap(":viewer/status.svg"));
-    acState->setToolTip("Show statuses");
+    acState->setToolTip("Filter by status");
     acState->setMenu(menuState);
     acLst << acState;
 
@@ -286,7 +288,7 @@ void TreeNodeWidget::notifyChange(VProperty* p)
     }
 }
 
-void TreeNodeWidget::writeSettings(VSettings* vs)
+void TreeNodeWidget::writeSettings(VComboSettings* vs)
 {
 	vs->put("type",type_);
 	vs->put("dockId",id_);
@@ -306,7 +308,7 @@ void TreeNodeWidget::writeSettings(VSettings* vs)
     DashboardWidget::writeSettings(vs);
 }
 
-void TreeNodeWidget::readSettings(VSettings* vs)
+void TreeNodeWidget::readSettings(VComboSettings* vs)
 {
 	std::string type=vs->get<std::string>("type","");
 	if(type != type_)
diff --git a/Viewer/src/TreeNodeWidget.hpp b/Viewer/src/TreeNodeWidget.hpp
index f2de834..7828932 100644
--- a/Viewer/src/TreeNodeWidget.hpp
+++ b/Viewer/src/TreeNodeWidget.hpp
@@ -33,8 +33,8 @@ public:
 
 	void rerender();
     bool initialSelectionInView();
-	void writeSettings(VSettings*);
-	void readSettings(VSettings*);
+    void writeSettings(VComboSettings*);
+    void readSettings(VComboSettings*);
 
     void notifyChange(VProperty*);
 
diff --git a/Viewer/src/TriggerBrowser.cpp b/Viewer/src/TriggerBrowser.cpp
deleted file mode 100644
index c5df50d..0000000
--- a/Viewer/src/TriggerBrowser.cpp
+++ /dev/null
@@ -1,292 +0,0 @@
-//============================================================================
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 "TriggerBrowser.hpp"
-
-#include <QDebug>
-#include <QPlainTextEdit>
-
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
-#include <QGuiApplication>
-#endif
-
-#include "Highlighter.hpp"
-#include "TriggerCollector.hpp"
-#include "TriggerItemWidget.hpp"
-#include "VAttribute.hpp"
-#include "VItemPathParser.hpp"
-
-TriggerBrowser::TriggerBrowser(QWidget *parent) : QWidget(parent), owner_(0)
-{
-    setupUi(this);
-
-    //We use this plaintextedit to generate the syntax highligted html text for
-    //the trigger expression.
-    exprTe_=new QPlainTextEdit(this);
-    exprTe_->hide();
-    exprHighlight_=new Highlighter(exprTe_->document(),"trigger");
-
-    triggerCollector_=new TriggerListCollector(false);
-
-    Q_ASSERT(tab_->count() == 2);
-    tab_->setCurrentIndex(tabIndexToInt(TriggerTabIndex));
-
-    QFont f("Monospace");
-    f.setStyleHint(QFont::TypeWriter);
-    f.setFixedPitch(true);
-    f.setPointSize(10);
-    f.setStyleStrategy(QFont::PreferAntialias);
-    triggerBrowser_->setFont(f);
-    triggeredBrowser_->setFont(f);
-
-    connect(triggerBrowser_,SIGNAL(anchorClicked(const QUrl&)),
-            this,SLOT(anchorClicked(const QUrl&)));
-
-    connect(triggeredBrowser_,SIGNAL(anchorClicked(const QUrl&)),
-            this,SLOT(anchorClicked(const QUrl&)));
-}
-
-TriggerBrowser::~TriggerBrowser()
-{
-    delete triggerCollector_;
-}
-
-void TriggerBrowser::setOwner(TriggerItemWidget* owner)
-{
-    Q_ASSERT(!owner_);
-    owner_=owner;
-}
-
-void TriggerBrowser::clear()
-{
-    triggerCollector_->clear();
-    loadedTabs_.clear();
-    triggerBrowser_->clear();
-    triggeredBrowser_->clear();
-}
-
-void TriggerBrowser::suspend()
-{
-    triggerCollector_->clear();
-}
-
-void TriggerBrowser::load()
-{    
-    Q_ASSERT(owner_);
-
-    loadedTabs_.clear();
-
-    if(tab_->currentIndex() == tabIndexToInt(TriggerTabIndex))
-    {
-        loadTriggerTab(true);
-    }
-    else if(tab_->currentIndex() == tabIndexToInt(TriggeredTabIndex))
-    {
-        loadTriggeredTab(true);
-    }
-}
-
-void TriggerBrowser::loadTriggerTab(bool forceLoad)
-{
-    if(!forceLoad && isTabLoaded(TriggerTabIndex))
-        return;
-
-    VNode *n=owner_->info()->node();
-    Q_ASSERT(n);
-
-    std::string te,ce;
-    n->triggerExpr(te,ce);
-
-    QString s="<table width=\'100%\'>";
-
-    //Trigger expression
-    if(!te.empty())
-    {
-        //Generate syntax highlighted html text for the trigger expression
-        QString tb;
-        exprTe_->setPlainText(QString::fromStdString(te));
-        exprHighlight_->toHtml(tb);
-
-        //We extract the useful bit from the html text
-        QRegExp rx("<!--StartFragment-->(.+)<!--EndFragment-->");
-        if(rx.indexIn(tb) > -1 && rx.captureCount() == 1)
-        {
-            tb=rx.cap(1);
-        }
-
-        tb="<font face=\'monospace\'>" + tb + "</font>";
-
-        s+="<tr><td colspan=\'2\' class=\'trigger_title\'>Trigger expression</td></tr><tr><td colspan=\'2\' class=\'trigger\'> <p>" +
-                 tb + "</p></td></tr>";
-    }
-
-    triggerCollector_->setDependency(owner_->dependency());
-
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
-    QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
-#endif
-    n->triggers(triggerCollector_);
-    s+=makeHtml(triggerCollector_,"Triggers directly triggering the selected node","Triggers");
-    s+="</table>";
-    triggerBrowser_->setHtml(s);
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
-    QGuiApplication::restoreOverrideCursor();
-#endif
-
-    loadedTabs_.insert(TriggerTabIndex);
-}
-
-void TriggerBrowser::loadTriggeredTab(bool forceLoad)
-{
-    if(!forceLoad && isTabLoaded(TriggeredTabIndex))
-        return;
-
-    VNode *n=owner_->info()->node();
-    Q_ASSERT(n);
-
-    TriggerListCollector c(owner_->dependency());
-    n->triggered(&c,owner_->triggeredScanner());
-
-    QString s="<table width=\'100%\'>";
-    s+=makeHtml(&c,"Nodes directly triggered by the selected node","Triggered");
-    s+="</table>";
-    triggeredBrowser_->setHtml(s);
-
-    loadedTabs_.insert(TriggeredTabIndex);
-}
-
-void TriggerBrowser::on_tab__currentChanged(int idx)
-{
-    if(owner_ && !owner_->isSuspended())
-    {
-        if(idx == tabIndexToInt(TriggerTabIndex))
-            loadTriggerTab();
-        else if(idx == tabIndexToInt(TriggeredTabIndex))
-            loadTriggeredTab();
-    }
-}
-
-bool TriggerBrowser::isTabLoaded(TabIndex idx) const
-{
-    return (loadedTabs_.find(idx) != loadedTabs_.end());
-}
-
-int TriggerBrowser::tabIndexToInt(TabIndex idx) const
-{
-    return static_cast<int>(idx);
-}
-
-//Updates the trigger list if the right type of change happened
-void TriggerBrowser::nodeChanged(const VNode* n)
-{
-    if(!isTabLoaded(TriggerTabIndex))
-        return;
-
-    VNode *node=owner_->info()->node();
-    Q_ASSERT(node);
-    if(n == node)
-    {
-        loadTriggerTab(true);
-        return;
-    }
-
-    const std::vector<TriggerListItem*>& items=triggerCollector_->items();
-    for(unsigned int i=0; i < items.size(); i++)
-    {
-        if(VItem *t=items[i]->item())
-        {
-            if(VAttribute* a=t->isAttribute())
-            {
-                if(a->parent() == n)
-                {
-                    loadTriggerTab(true);
-                    return;
-                }
-            }
-        }
-    }
-}
-
-void TriggerBrowser::anchorClicked(const QUrl& link)
-{
-    owner_->linkSelected(link.toString().toStdString());
-    tab_->setCurrentIndex(TriggerTabIndex);
-}
-
-QString TriggerBrowser::makeHtml(TriggerListCollector *tc,QString directTitle,QString modeText) const
-{
-    QString s;
-    bool firstDirectTrigger=true;
-    const std::vector<TriggerListItem*>& items=tc->items();
-
-    for(unsigned int i=0; i < items.size(); i++)
-    {
-        VItem *t=items[i]->item();
-        VItem *d=items[i]->dep();
-        if(!t)
-            continue;
-
-        if(!d)
-        {
-            if(firstDirectTrigger)
-            {
-                s+="<tr><td class=\'direct_title\' colspan=\'2\'>" + directTitle + "</td></tr>";
-                firstDirectTrigger=false;
-            }
-
-            QString type=QString::fromStdString(t->typeName());
-            QString path=QString::fromStdString(t->fullPath());
-            QString anchor=QString::fromStdString(VItemPathParser::encode(t->fullPath(),t->typeName()));
-
-            s+="<tr>";
-            s+="<td width=\'100\'>" + type + "</td>";
-            s+="<td><a href=\'" + anchor  + "\'>" + path +"</a>";
-        }
-    }
-
-    QString prevH;
-
-    for(unsigned int i=0; i < items.size(); i++)
-    {
-        VItem *t=items[i]->item();
-        VItem *d=items[i]->dep();
-        if(!t || !d)
-            continue;
-
-        QString h;
-
-        if(items[i]->mode()== TriggerCollector::Parent)
-           h+=modeText + " through parent";
-        else
-           h+=modeText + " through child";
-
-        QString type=QString::fromStdString(d->typeName());
-        QString path=QString::fromStdString(d->fullPath());
-        QString anchor=QString::fromStdString(VItemPathParser::encode(d->fullPath(),d->typeName()));
-
-        h+="  " + type;
-        h+=" <a class=\'chp\' href=\'" + anchor + "\'>" + path +"</a>";
-
-        if(h != prevH)
-        {
-            s+="<tr><td class=\'title\' colspan=\'2\'>" + h + "</td></tr>";
-            prevH=h;
-        }
-
-        type=QString::fromStdString(t->typeName());
-        path=QString::fromStdString(t->fullPath());
-        anchor=QString::fromStdString(VItemPathParser::encode(t->fullPath(),t->typeName()));
-
-        s+="<tr>";
-        s+="<td width=\'100\'>" + type + "</td>";
-        s+="<td><a href=\'" +  anchor + "\'>" + path +"</a>";
-     }
-
-    return s;
-}
diff --git a/Viewer/src/TriggerBrowser.hpp b/Viewer/src/TriggerBrowser.hpp
deleted file mode 100644
index 13bad0a..0000000
--- a/Viewer/src/TriggerBrowser.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-//============================================================================
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 TRIGGERBROWSER_HPP
-#define TRIGGERBROWSER_HPP
-
-#include <QWidget>
-
-#include <set>
-
-#include "ui_TriggerBrowser.h"
-
-#include "VInfo.hpp"
-
-class QPlainTextEdit;
-class Highlighter;
-class TriggerItemWidget;
-class TriggerListCollector;
-
-class TriggerBrowser : public QWidget, protected Ui::TriggerBrowser
-{
-Q_OBJECT
-
-public:
-    explicit TriggerBrowser(QWidget *parent=0);
-    ~TriggerBrowser();
-
-    void setOwner(TriggerItemWidget*);
-    void clear();
-    void load();
-    void suspend();
-    void nodeChanged(const VNode*);
-
-protected Q_SLOTS:
-    void on_tab__currentChanged(int idx);
-    void anchorClicked(const QUrl& link);
-
-private:
-    enum TabIndex {TriggerTabIndex=0, TriggeredTabIndex=1};
-
-    void loadTriggerTab(bool forceLoad=false);
-    void loadTriggeredTab(bool forceLoad=false);
-    bool isTabLoaded(TabIndex idx) const;
-    int tabIndexToInt(TabIndex idx) const;
-    QString makeHtml(TriggerListCollector *tc,QString,QString) const;
-
-    TriggerItemWidget* owner_;
-    std::set<TabIndex> loadedTabs_;
-    QPlainTextEdit* exprTe_;
-    Highlighter* exprHighlight_;
-    TriggerListCollector* triggerCollector_;
-};
-
-#endif // TRIGGERBROWSER_HPP
diff --git a/Viewer/src/TriggerBrowser.ui b/Viewer/src/TriggerBrowser.ui
deleted file mode 100644
index faa3458..0000000
--- a/Viewer/src/TriggerBrowser.ui
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>TriggerBrowser</class>
- <widget class="QWidget" name="TriggerBrowser">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>400</width>
-    <height>300</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <property name="spacing">
-    <number>1</number>
-   </property>
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
-    <number>0</number>
-   </property>
-   <item>
-    <widget class="QTabWidget" name="tab_">
-     <property name="currentIndex">
-      <number>1</number>
-     </property>
-     <widget class="QWidget" name="tab">
-      <attribute name="title">
-       <string>Triggers of the selected node</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="TriggerTextWidget" name="triggerBrowser_"/>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="tab_2">
-      <attribute name="title">
-       <string>Nodes triggered by the selected node</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_3">
-       <property name="spacing">
-        <number>0</number>
-       </property>
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
-        <number>0</number>
-       </property>
-       <item>
-        <widget class="TriggerTextWidget" name="triggeredBrowser_"/>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>TriggerTextWidget</class>
-   <extends>QTextBrowser</extends>
-   <header>TriggerTextWidget.hpp</header>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
diff --git a/Viewer/src/TriggerCollector.cpp b/Viewer/src/TriggerCollector.cpp
index 4a58a72..a3a2a91 100644
--- a/Viewer/src/TriggerCollector.cpp
+++ b/Viewer/src/TriggerCollector.cpp
@@ -10,10 +10,13 @@
 #include "TriggerCollector.hpp"
 
 #include "UiLog.hpp"
+#include "VAttribute.hpp"
 #include "VItem.hpp"
 #include "VItemPathParser.hpp"
 #include "VNode.hpp"
 
+#include <algorithm>
+
 #define _UI_TRIGGERCOLLECTOR_DEBUG
 
 TriggerListCollector::~TriggerListCollector()
@@ -56,7 +59,7 @@ bool TriggerChildCollector::add(VItem* t, VItem*,Mode)
 {
     if(!t->isAncestor(node_))
     {
-        // child is a kid of n whose trigger_panel is outside its subtree
+        // child_ is a kid of node_ whose trigger is outside its subtree
         return collector_->add(t,child_,TriggerCollector::Child);
     }
     return false;
@@ -79,3 +82,116 @@ bool TriggeredCollector::add(VItem* trigger, VItem*,Mode)
     //    trigger->parent()->addTriggeredData(node_,trigger);
 }
 
+const std::set<TriggerCollector::Mode>& TriggerTableItem::modes() const
+{
+    if(modes_.empty())
+    {
+        for(std::size_t i=0; i < deps_.size(); i++)
+        {
+            modes_.insert(deps_[i].mode());
+        }
+    }
+    return modes_;
+}
+
+//=====================================
+// TriggerTableCollector
+//=====================================
+
+TriggerTableCollector::~TriggerTableCollector()
+{
+    clear();
+}
+
+bool TriggerTableCollector::add(VItem* trigger, VItem* dep,Mode mode)
+{
+    Q_ASSERT(trigger);
+
+    TriggerTableItem *item=0;
+    for(std::size_t i=0; i < items_.size(); i++)
+    {
+        if(items_[i]->item() == trigger)
+        {          
+            item=items_[i];
+            break;
+        }
+    }
+
+    if(!item)
+    {        
+        item=new TriggerTableItem(trigger);
+        items_.push_back(item);
+    }
+
+    item->addDependency(dep,mode);
+    return true;
+}
+
+void TriggerTableCollector::setDependency(bool b)
+{
+    extended_=b;
+    clear();
+}
+
+void TriggerTableCollector::clear()
+{
+    for(size_t i=0; i < items_.size(); i++)
+    {
+        delete items_[i];
+    }
+    items_.clear();
+}
+
+bool TriggerTableCollector::contains(TriggerTableItem* item) const
+{
+    return (std::find(items_.begin(),items_.end(), item) != items_.end());
+}
+
+bool TriggerTableCollector::contains(const VNode* node,bool attrParents) const
+{
+    for(size_t i=0; i < items_.size(); i++)
+    {
+        if(VItem* it=items_[i]->item())
+        {
+            if(VNode *n=it->isNode())
+            {
+                if(n == node)
+                    return true;
+            }
+            else if(attrParents)
+            {
+                if (VAttribute *a=it->isAttribute())
+                    if(a->parent() == node)
+                        return true;
+            }
+        }
+
+    }
+
+    return false;
+}
+
+TriggerTableItem* TriggerTableCollector::find(const VItem* item) const
+{
+    for(size_t i=0; i < items_.size(); i++)
+    {
+        if(items_[i]->item() == item)
+            return items_[i];
+    }
+    return 0;
+}
+
+TriggerTableItem* TriggerTableCollector::findByContents(const VItem* item) const
+{
+    if(!item)
+        return 0;
+
+    for(size_t i=0; i < items_.size(); i++)
+    {
+        if(item->sameContents(items_[i]->item()))
+        {
+            return items_[i];
+        }
+    }
+    return 0;
+}
diff --git a/Viewer/src/TriggerCollector.hpp b/Viewer/src/TriggerCollector.hpp
index 2a1ea5a..d917392 100644
--- a/Viewer/src/TriggerCollector.hpp
+++ b/Viewer/src/TriggerCollector.hpp
@@ -10,6 +10,7 @@
 #ifndef TRIGGERCOLLECTOR_HPP
 #define TRIGGERCOLLECTOR_HPP
 
+#include <set>
 #include <string>
 #include <vector>
 
@@ -54,6 +55,7 @@ public:
     bool scanKids() { return extended_; }
     void setDependency(bool);
     void clear();
+    size_t size() const {return items_.size();}
 
     const std::vector<TriggerListItem*>& items() const {return items_;}
 
@@ -116,6 +118,86 @@ protected:
     TriggerCollector::Mode mode_;
 };
 
+class TriggerDependencyItem
+{
+public:
+    TriggerDependencyItem(VItem* dep,TriggerCollector::Mode mode) :
+        dep_(dep), mode_(mode) {}
+
+    VItem* dep()  const {return dep_;}
+    TriggerCollector::Mode mode() const {return mode_;}
+
+protected:
+    VItem* dep_;
+    TriggerCollector::Mode mode_;
+};
+
+class TriggerTableItem
+{
+public:
+    TriggerTableItem(VItem* t) :t_(t){}
+
+    void addDependency(VItem* dep,TriggerCollector::Mode mode)
+            {deps_.push_back(TriggerDependencyItem(dep,mode));}
+
+    VItem* item() const {return t_;}
+    const std::vector<TriggerDependencyItem>& dependencies() const {return deps_;}
+    const std::set<TriggerCollector::Mode>& modes() const;
+
+protected:
+     VItem* t_; //trigger or triggered
+     std::vector<TriggerDependencyItem> deps_;
+     mutable std::set<TriggerCollector::Mode> modes_;
+};
+
+
+class TriggerTableCollector : public TriggerCollector
+{
+public:
+    TriggerTableCollector(bool extended) :
+        extended_(extended) {}
+
+    ~TriggerTableCollector();
+    bool add(VItem*, VItem*,Mode);
+    bool scanParents() { return extended_; }
+    bool scanKids() { return extended_; }
+    void setDependency(bool);
+    void clear();
+    size_t size() const {return items_.size();}
+
+    bool contains(TriggerTableItem*) const;
+    bool contains(const VNode*,bool attrParents=true) const;
+    TriggerTableItem* find(const VItem* item) const;
+    TriggerTableItem* findByContents(const VItem* item) const;
+    const std::vector<TriggerTableItem*>& items() const {return items_;}
+
+protected:
+    bool extended_;
+    std::vector<TriggerTableItem*> items_;
+};
+
+#if 0
+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_; }
+};
+#endif
+
 
 #endif // TRIGGERCOLLECTOR_HPP
 
diff --git a/Viewer/src/TriggerEditor.cpp b/Viewer/src/TriggerEditor.cpp
index d3ba6bc..99af368 100644
--- a/Viewer/src/TriggerEditor.cpp
+++ b/Viewer/src/TriggerEditor.cpp
@@ -30,7 +30,8 @@ TriggerEditorWidget::TriggerEditorWidget(QWidget* parent) : QWidget(parent)
     item->setAlignment(Qt::AlignLeft|Qt::AlignTop);
 #endif
 
-    Highlighter *h=new Highlighter(te_->document(),"trigger");
+    //The document becomes the owner of the highlighte
+    new Highlighter(te_->document(),"trigger");
     te_->setShowLineNumbers(false);
 }
 
diff --git a/Viewer/src/TriggerItemWidget.cpp b/Viewer/src/TriggerItemWidget.cpp
index dc67cf4..667edc9 100644
--- a/Viewer/src/TriggerItemWidget.cpp
+++ b/Viewer/src/TriggerItemWidget.cpp
@@ -9,11 +9,17 @@
 
 #include "TriggerItemWidget.hpp"
 
-#include "TriggerView.hpp"
+#include "Highlighter.hpp"
+#include "ServerHandler.hpp"
+#include "TriggerCollector.hpp"
 #include "TriggeredScanner.hpp"
 #include "VNode.hpp"
 #include "VSettings.hpp"
 
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+#include <QGuiApplication>
+#endif
+
 //========================================================
 //
 // TriggerItemWidget
@@ -22,17 +28,17 @@
 
 TriggerItemWidget::TriggerItemWidget(QWidget *parent) : QWidget(parent)
 {
-    setupUi(this);
+    //This item will listen to any changes in nodes
+    handleAnyChange_=true;
 
-    messageLabel_->hide();
-    messageLabel_->setShowTypeTitle(false);
+    //We will not keep the contents when the item becomes unselected
+    unselectedFlags_.clear();
 
-    textTb_->hide();
-    graphTb_->hide();
-    triggerView_->hide();
+    setupUi(this);
 
-    //Dependencies
-    dependTb_->setChecked(false);
+    //The collectors
+    triggerCollector_=new TriggerTableCollector(false);
+    triggeredCollector_=new TriggerTableCollector(false);
 
     //Scanner
     scanner_=new TriggeredScanner(this);
@@ -46,7 +52,54 @@ TriggerItemWidget::TriggerItemWidget(QWidget *parent) : QWidget(parent)
     connect(scanner_,SIGNAL(scanProgressed(int)),
             this,SLOT(scanProgressed(int)));
 
-    textBrowser_->setOwner(this);
+    //Messages
+    messageLabel_->hide();
+    messageLabel_->setShowTypeTitle(false);
+
+    //Dependency info inti must precede dependency init
+    //since they depend on each other
+
+    //dependency info is off by default
+    dependInfoTb_->setChecked(false);
+    on_dependInfoTb__toggled(false);
+
+    //Dependency is off by default
+    dependTb_->setChecked(false);
+    on_dependTb__toggled(false);
+
+    //Expression
+    exprTb_->setChecked(true);
+
+    //The document becomes the owner of the highlighter
+    new Highlighter(exprTe_->document(),"trigger");
+    exprTe_->setReadOnly(true);
+    exprTe_->setBackgroundVisible(true);
+
+    //Set the height of the trigger expression display area
+    QFont fTe;
+    fTe.setBold(true);
+    QFontMetrics fm(fTe);
+    exprTe_->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);
+    exprTe_->setFixedHeight(fm.size(0,"A\nA\nA").height()+fm.height()/2);
+
+    connect(triggerTable_,SIGNAL(depInfoWidgetClosureRequested()),
+            this,SLOT(slotHandleDefInfoWidgetClosure()));
+
+    connect(triggerTable_,SIGNAL(linkSelected(VInfo_ptr)),
+            this,SLOT(slotLinkSelected(VInfo_ptr)));
+
+    connect(triggerTable_,SIGNAL(infoPanelCommand(VInfo_ptr,QString)),
+        this,SLOT(slotInfoPanelCommand(VInfo_ptr,QString)));
+
+    connect(triggerTable_,SIGNAL(dashboardCommand(VInfo_ptr,QString)),
+        this,SLOT(slotDashboardCommand(VInfo_ptr,QString)));
+}
+
+TriggerItemWidget::~TriggerItemWidget()
+{
+    clearContents();
+    delete triggerCollector_;
+    delete triggeredCollector_;
 }
 
 QWidget* TriggerItemWidget::realWidget()
@@ -63,38 +116,103 @@ void TriggerItemWidget::reload(VInfo_ptr info)
 
     clearContents();
 
-    info_=info;
+    //set the info
+    adjust(info);
+
     //messageLabel_->hide();
 
     //Info must be a node
-    if(info_ && info_->isNode() && info_->node())
-    {
-        textBrowser_->load();
-    }
+    load();
 }
 
 void TriggerItemWidget::load()
 {
+    clearTriggers();
+
     if(info_ && info_->isNode() && info_->node())
-    {        
-        textBrowser_->load();
+    {
+        VNode* n=info_->node();
+        Q_ASSERT(n);
+
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+        QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+#endif
+
+        //Display trigger expression
+        std::string te,ce;
+        n->triggerExpr(te,ce);
+        QString txt=QString::fromStdString(te);
+        if(txt.isEmpty()) txt=tr("No trigger expression is available for the selected node!");
+        exprTe_->setPlainText(txt);
+
+        triggerTable_->setInfo(info_);
+
+        //Load table
+        triggerTable_->beginTriggerUpdate();
+
+        //collect the list of triggers of this node
+        triggerCollector_->setDependency(dependency());
+        n->triggers(triggerCollector_);
+
+        triggeredCollector_->setDependency(dependency());
+        n->triggered(triggeredCollector_,triggeredScanner());
+
+        triggerTable_->setTriggerCollector(triggerCollector_,triggeredCollector_);
+        triggerTable_->endTriggerUpdate();
+
+        triggerTable_->resumeSelection();
+
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+        QGuiApplication::restoreOverrideCursor();
+#endif
     }
 }
 
 void TriggerItemWidget::clearContents()
 {
     InfoPanelItem::clear();
-    textBrowser_->clear();
+    exprTe_->clear();
+    triggerTable_->clear();
+
+    if(!active_)
+        triggerTable_->clearSelection();
+
+    //At this point the tables are cleared so it is safe to clear the collectors
+    triggerCollector_->clear();
+    triggeredCollector_->clear();
+}
+
+void TriggerItemWidget::clearTriggers()
+{
+    exprTe_->clear();
+    triggerTable_->clear();
+
+    //At this point the tables are cleared so it is safe to clear the collectors
+    triggerCollector_->clear();
+    triggeredCollector_->clear();
 }
 
 void TriggerItemWidget::updateState(const FlagSet<ChangeFlag>& flags)
 {
     if(flags.isSet(SuspendedChanged))
     {
+        //If we are here this item is active but not selected!
+
+        //When it becomes suspended we need to clear everything since the
+        //tree is probably cleared at this point
         if(suspended_)
-           textBrowser_->suspend();
+        {
+            clearTriggers();
+        }
+        //When we leave the suspended state we need to reload everything
+        else
+        {
+            load();
+        }
     }
 
+    Q_ASSERT(!flags.isSet(SelectedChanged));
+
     checkActionState();
 }
 
@@ -102,22 +220,70 @@ void TriggerItemWidget::checkActionState()
 {
     if(suspended_)
     {
-         dependTb_->setEnabled(false);
+         dependTb_->setEnabled(false);         
          return;
     }
 
     dependTb_->setEnabled(true);
 }
 
-void TriggerItemWidget::on_dependTb__toggled(bool)
+void TriggerItemWidget::on_dependTb__toggled(bool b)
 {   
     load();
+
+    //when we activate the dependencies we always show the
+    //dependency details as well
+    if(b)
+    {
+        dependInfoTb_->setEnabled(true);
+        if(dependInfoTb_->isChecked() == false)
+        {
+            dependInfoTb_->setChecked(true);
+        }
+    }
+    else
+    {
+        dependInfoTb_->setChecked(false);
+        dependInfoTb_->setEnabled(false);
+    }
+}
+
+void TriggerItemWidget::on_dependInfoTb__toggled(bool b)
+{
+    triggerTable_->slotShowDependencyInfo(b);
+}
+
+void TriggerItemWidget::slotHandleDefInfoWidgetClosure()
+{
+    dependInfoTb_->setChecked(false);
+}
+
+void TriggerItemWidget::on_exprTb__toggled(bool b)
+{
+    exprTe_->setVisible(b);
 }
 
 bool TriggerItemWidget::dependency() const
 {
     return dependTb_->isChecked();
 }
+
+
+void TriggerItemWidget::slotLinkSelected(VInfo_ptr info)
+{
+   InfoPanelItem::linkSelected(info);
+}
+
+void TriggerItemWidget::slotInfoPanelCommand(VInfo_ptr info,QString cmd)
+{
+    InfoPanelItem::relayInfoPanelCommand(info,cmd);
+}
+
+void TriggerItemWidget::slotDashboardCommand(VInfo_ptr info,QString cmd)
+{
+    InfoPanelItem::relayDashboardCommand(info,cmd);
+}
+
 #if 0
 void TriggerItemWidget::infoProgressStart(const std::string& text,int max)
 {
@@ -150,22 +316,34 @@ void TriggerItemWidget::scanProgressed(int value)
     messageLabel_->progress(QString::fromStdString(text),value);
 }
 
-void TriggerItemWidget::writeSettings(VSettings* vs)
+void TriggerItemWidget::writeSettings(VComboSettings* vs)
 {
-#if 0
     vs->beginGroup("triggers");
     vs->putAsBool("dependency",dependency());
+    vs->putAsBool("dependencyInfo",dependInfoTb_->isChecked());
+    vs->putAsBool("expression",exprTb_->isChecked());
+
+    triggerTable_->writeSettings(vs);
     vs->endGroup();
-#endif
 }
 
-void TriggerItemWidget::readSettings(VSettings* vs)
+void TriggerItemWidget::readSettings(VComboSettings* vs)
 {
-#if 0
     vs->beginGroup("triggers");
+
     dependTb_->setChecked(vs->getAsBool("dependency",dependency()));
-    vs->endGroup();
+
+// dependInfoTb_ is initialised by dependTb_ !!
+#if 0
+    if(dependTb_->isChecked())
+    {
+        dependInfoTb_->setChecked(vs->getAsBool("dependencyInfo",dependInfoTb_->isChecked()));
+    }
 #endif
+
+    exprTb_->setChecked(vs->getAsBool("expression",exprTb_->isChecked()));
+    triggerTable_->readSettings(vs);
+    vs->endGroup();
 }
 
 //-------------------------
@@ -174,19 +352,47 @@ void TriggerItemWidget::readSettings(VSettings* vs)
 
 void TriggerItemWidget::nodeChanged(const VNode* n, const std::vector<ecf::Aspect::Type>& aspect)
 {
+    //We do not track changes when the item is not selected
+    if(!selected_ || !active_)
+        return;
+
     if(!info_ || !info_->isNode())
         return;
 
-    //Changes in the nodes
+    //If the triggers are not scanned there must have been a major change and
+    //we need to reload the item
+    if(!info_->node()->root()->triggeredScanned())
+    {
+        load();
+        return;
+    }
+
+    //For certain changes we need to reload the triggers
     for(std::vector<ecf::Aspect::Type>::const_iterator it=aspect.begin(); it != aspect.end(); ++it)
     {
-        if(*it == ecf::Aspect::ADD_REMOVE_ATTR || *it == ecf::Aspect::NODE_VARIABLE ||
-            *it == ecf::Aspect::EXPR_TRIGGER || *it == ecf::Aspect::EXPR_COMPLETE)
+        if(*it == ecf::Aspect::ADD_REMOVE_ATTR || *it == ecf::Aspect::EXPR_TRIGGER)
         {
-            textBrowser_->nodeChanged(n);
+            load();
             return;
         }
     }
+
+    //For other changes we only reload the triggers if the change happened to an item in the collected triggers
+    for(std::vector<ecf::Aspect::Type>::const_iterator it=aspect.begin(); it != aspect.end(); ++it)
+    {
+        if(*it == ecf::Aspect::NODE_VARIABLE || *it == ecf::Aspect::METER || *it == ecf::Aspect::LIMIT ||
+                *it == ecf::Aspect::EVENT)
+        {
+           if(triggerCollector_->contains(n,true) || triggeredCollector_->contains(n,true))
+           {
+               load();
+               return;
+           }
+        }
+    }
+
+    //For the rest of the changes in we rerender the collected items that might have changed
+    triggerTable_->nodeChanged(n,aspect);
 }
 
 static InfoPanelItemMaker<TriggerItemWidget> maker1("triggers");
diff --git a/Viewer/src/TriggerItemWidget.hpp b/Viewer/src/TriggerItemWidget.hpp
index 2327f04..e23598a 100644
--- a/Viewer/src/TriggerItemWidget.hpp
+++ b/Viewer/src/TriggerItemWidget.hpp
@@ -18,7 +18,9 @@
 
 #include "ui_TriggerItemWidget.h"
 
+class QActionGroup;
 class TriggeredScanner;
+class TriggerTableCollector;
 
 class TriggerItemWidget : public QWidget, public InfoPanelItem, protected Ui::TriggerItemWidget
 {
@@ -28,6 +30,7 @@ Q_OBJECT
 
 public:
 	explicit TriggerItemWidget(QWidget *parent=0);
+    ~TriggerItemWidget();
 
 	void reload(VInfo_ptr);
 	QWidget* realWidget();
@@ -38,22 +41,31 @@ public:
 
     bool dependency() const;
 
-    void writeSettings(VSettings* vs);
-    void readSettings(VSettings* vs);
+    void writeSettings(VComboSettings* vs);
+    void readSettings(VComboSettings* vs);
 
 protected Q_SLOTS:
     void on_dependTb__toggled(bool);
+    void on_dependInfoTb__toggled(bool b);
+    void on_exprTb__toggled(bool b);
     void scanStarted();
     void scanFinished();
     void scanProgressed(int);
+    void slotHandleDefInfoWidgetClosure();
+    void slotLinkSelected(VInfo_ptr info);
+    void slotInfoPanelCommand(VInfo_ptr info,QString cmd);
+    void slotDashboardCommand(VInfo_ptr info,QString cmd);
 
 protected:
     void load();
     void updateState(const ChangeFlags&);
     TriggeredScanner* triggeredScanner() const {return scanner_;}
     void checkActionState();
+    void clearTriggers();
 
-    TriggeredScanner *scanner_;
+    TriggerTableCollector* triggerCollector_;
+    TriggerTableCollector* triggeredCollector_;
+    TriggeredScanner *scanner_;  
 };
 
 #endif
diff --git a/Viewer/src/TriggerItemWidget.ui b/Viewer/src/TriggerItemWidget.ui
index d2a90c7..4640f35 100644
--- a/Viewer/src/TriggerItemWidget.ui
+++ b/Viewer/src/TriggerItemWidget.ui
@@ -13,7 +13,7 @@
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,1,0">
+  <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0,1">
    <property name="spacing">
     <number>1</number>
    </property>
@@ -26,19 +26,24 @@
    <property name="rightMargin">
     <number>0</number>
    </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
-      <widget class="QToolButton" name="textTb_">
-       <property name="text">
-        <string>Text</string>
+      <widget class="QToolButton" name="exprTb_">
+       <property name="toolTip">
+        <string>Show trigger expression</string>
        </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QToolButton" name="graphTb_">
        <property name="text">
-        <string>graphics</string>
+        <string>Expression</string>
+       </property>
+       <property name="checkable">
+        <bool>true</bool>
+       </property>
+       <property name="toolButtonStyle">
+        <enum>Qt::ToolButtonTextOnly</enum>
        </property>
       </widget>
      </item>
@@ -57,12 +62,35 @@
      </item>
      <item>
       <widget class="QToolButton" name="dependTb_">
+       <property name="toolTip">
+        <string>Show dependencies (with darker background)</string>
+       </property>
        <property name="text">
         <string>Dependencies</string>
        </property>
        <property name="checkable">
         <bool>true</bool>
        </property>
+       <property name="toolButtonStyle">
+        <enum>Qt::ToolButtonTextOnly</enum>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="dependInfoTb_">
+       <property name="toolTip">
+        <string>Show dependency details</string>
+       </property>
+       <property name="text">
+        <string>Text</string>
+       </property>
+       <property name="icon">
+        <iconset resource="viewer.qrc">
+         <normaloff>:/viewer/dependency.svg</normaloff>:/viewer/dependency.svg</iconset>
+       </property>
+       <property name="checkable">
+        <bool>true</bool>
+       </property>
       </widget>
      </item>
     </layout>
@@ -71,32 +99,45 @@
     <widget class="MessageLabel" name="messageLabel_" native="true"/>
    </item>
    <item>
-    <widget class="TriggerBrowser" name="textBrowser_" native="true"/>
+    <widget class="QPlainTextEdit" name="exprTe_"/>
    </item>
    <item>
-    <widget class="TriggerView" name="triggerView_"/>
+    <widget class="TriggerTableWidget" name="triggerTable_" native="true"/>
    </item>
   </layout>
+  <action name="actionTextMode_">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Text</string>
+   </property>
+  </action>
+  <action name="actionTableMode_">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Table</string>
+   </property>
+  </action>
  </widget>
  <customwidgets>
   <customwidget>
-   <class>TriggerView</class>
-   <extends>QGraphicsView</extends>
-   <header>TriggerView.hpp</header>
-  </customwidget>
-  <customwidget>
-   <class>TriggerBrowser</class>
+   <class>MessageLabel</class>
    <extends>QWidget</extends>
-   <header>TriggerBrowser.hpp</header>
+   <header>MessageLabel.hpp</header>
    <container>1</container>
   </customwidget>
   <customwidget>
-   <class>MessageLabel</class>
+   <class>TriggerTableWidget</class>
    <extends>QWidget</extends>
-   <header>MessageLabel.hpp</header>
+   <header>TriggerTableWidget.hpp</header>
    <container>1</container>
   </customwidget>
  </customwidgets>
- <resources/>
+ <resources>
+  <include location="viewer.qrc"/>
+ </resources>
  <connections/>
 </ui>
diff --git a/Viewer/src/TriggerProvider.cpp b/Viewer/src/TriggerProvider.cpp
deleted file mode 100644
index 20c1ca0..0000000
--- a/Viewer/src/TriggerProvider.cpp
+++ /dev/null
@@ -1,274 +0,0 @@
-//============================================================================
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 "TriggerProvider.hpp"
-
-#include "OutputDirClient.hpp"
-#include "VNode.hpp"
-#include "VReply.hpp"
-#include "ServerHandler.hpp"
-#include "UiLog.hpp"
-
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-
-TriggerProvider::TriggerProvider(InfoPresenter* owner) :
-    InfoProvider(owner,VTask::NoTask)
-{
-}
-
-void TriggerProvider::clear()
-{
-    InfoProvider::clear();
-}
-
-//Node
-void TriggerProvider::visit(VInfoNode* info)
-{
-    //Reset the reply
-    reply_->reset();
-
-    if(!info)
-    {
-        owner_->infoFailed(reply_);
-    }
-
-    ServerHandler* server=info_->server();
-    VNode *n=info->node();
-
-    if(!n || !n->node())
-    {
-        owner_->infoFailed(reply_);
-    }
-
-    triggers(server,n);
-}
-
-void TriggerProvider::trigger(ServerHandler* server,VNode* n)
-{
-    VDir_ptr dir;
-
-    if(!info_ || !info_->isNode() || !info_->node() || !info_->node()->node())
-    {
-        //reply_->setDirectory(dir);
-        owner_->infoFailed(reply_);
-    }
-
-    TriggerListCollector c(0,"Nodes/attributes triggering this node",dependency());
-    n->triggers(&c);
-
-    TriggerListCollector c1(0,"Nodes triggered by this node",dependency());
-    n->triggered(&c1);
-
-    triggerBrowser_->setHtml(c.text()+c1.text());
-
-    //Get the jobout name
-    std::string fileName=n->findVariable("ECF_JOBOUT",true);
-
-    //Check if it is tryno 0
-    //bool tynozero=(boost::algorithm::ends_with(fileName,".0"));
-
-    //Jobout is empty: no dir path is availabale
-    if(fileName.empty())
-    {
-        reply_->setDirectory(dir);
-        owner_->infoFailed(reply_);
-
-        return;
-    }
-
-    //----------------------------------
-    // The host is the localhost
-    //----------------------------------
-#if 0
-    //if(server->isLocalHost())
-    //{
-        if(server->readFromDisk())
-        {
-            dir=fetchLocalDir(fileName,tynozero);
-            if(dir)
-            {
-                reply_->setDirectory(dir);
-                owner_->infoReady(reply_);
-                return;
-            }
-        }
-   // }
-#endif
-    //----------------------------------------------------
-    // Not the localhost or we could not read dir
-    //----------------------------------------------------
-
-    //We try the output client, its asynchronous!
-    if(fetchDirViaOutputClient(n,fileName))
-    {
-        //If we are here we created a output client and asked to the fetch the
-        //file asynchronously. The ouput client will call slotOutputClientFinished() or
-        //slotOutputClientError eventually!!
-        return;
-    }
-
-    //If there is no output client and it is not the localhost we try
-    //to read it again from the disk!!!
-
-    dir=fetchLocalDir(fileName);
-    if(dir)
-    {
-        reply_->setDirectory(dir);
-        owner_->infoReady(reply_);
-        return;
-     }
-
-     //If we are we coud not get the file
-     reply_->setDirectory(dir);
-     owner_->infoFailed(reply_);
-}
-
-bool OutputDirProvider::fetchDirViaOutputClient(VNode *n,const std::string& fileName)
-{
-    std::string host, port;
-    if(n->logServer(host,port))
-    {
-        //host=host + "baaad";
-
-        //reply_->setInfoText("Getting file through log server: " + host + "@" + port);
-        //owner_->infoProgress(reply_);
-
-        outClient_=makeOutputClient(host,port);
-        outClient_->getDir(fileName);
-
-        return true;
-    }
-
-    return false;
-}
-
-void OutputDirProvider::slotOutputClientFinished()
-{
-    VDir_ptr dir = outClient_->result();
-
-    if(dir && dir.get())
-    {
-        reply_->setInfoText("");
-        //reply_->fileReadMode(VReply::LogServerReadMode);
-
-        //std::string method="served by " + outClient_->host() + "@" + outClient_->portStr();
-        //reply_->fileReadMethod(method);
-
-        reply_->setDirectory(dir);
-        owner_->infoReady(reply_);
-    }
-}
-
-void OutputDirProvider::slotOutputClientProgress(QString,int)
-{
-    /*reply_->setInfoText(msg.toStdString());
-    owner_->infoProgress(reply_);
-    reply_->setInfoText("");*/
-}
-
-void OutputDirProvider::slotOutputClientError(QString msg)
-{
-    if(info_ && info_.get())
-    {
-        if(ServerHandler* server=info_->server())
-        {
-            if(outClient_)
-            {
-                //Check if it is tryno 0
-                //bool tynozero=(boost::algorithm::ends_with(outClient_->remoteFile(),".0"));
-                VDir_ptr dir=fetchLocalDir(outClient_->remoteFile()); //,tynozero);
-                if(dir)
-                {
-                    reply_->setDirectory(dir);
-                    owner_->infoReady(reply_);
-                    return;
-                }
-            }
-        }
-
-        reply_->setErrorText(msg.toStdString());
-        owner_->infoFailed(reply_);
-    }
-}
-
-VDir_ptr OutputDirProvider::fetchLocalDir(const std::string& path)  //,bool trynozero)
-{
-    VDir_ptr res;
-
-    boost::filesystem::path p(path);
-
-    try {
-        //Is it a directory?
-        if(boost::filesystem::is_directory(p))
-        {
-            return res;
-        }
-        //It must be a file
-        //if((trynozero || boost::filesystem::exists(p)) &&
-        if(boost::filesystem::exists(p.parent_path()))
-        {
-            std::string dirName=p.parent_path().string();
-            //std::string fileName=p.leaf().string();
-
-            if(info_ && info_->isNode() && info_->node())
-            {
-                std::string nodeName=info_->node()->strName();
-                std::string pattern=nodeName+".";
-                res=VDir_ptr(new VDir(dirName,pattern));
-                return res;
-            }
-        }
-
-    }
-    catch (const boost::filesystem::filesystem_error& e)
-    {
-        UiLog().warn() << "fetchLocalDir failed:" << std::string(e.what());
-        return res;
-    }
-
-
-    return res;
-}
-
-OutputDirClient* OutputDirProvider::makeOutputClient(const std::string& host,const std::string& port)
-{
-    if(outClient_)
-    {
-        if(outClient_->host() != host || outClient_->portStr() != port)
-        {
-            delete outClient_;
-            outClient_=0;
-        }
-    }
-
-    if(!outClient_)
-    {
-        outClient_=new OutputDirClient(host,port,this);
-
-        connect(outClient_,SIGNAL(error(QString)),
-                this,SLOT(slotOutputClientError(QString)));
-
-        connect(outClient_,SIGNAL(progress(QString,int)),
-                this,SLOT(slotOutputClientProgress(QString,int)));
-
-        connect(outClient_,SIGNAL(finished()),
-                this,SLOT(slotOutputClientFinished()));
-    }
-
-    return outClient_;
-
-
-}
-
-
-
-
diff --git a/Viewer/src/TriggerProvider.hpp b/Viewer/src/TriggerProvider.hpp
deleted file mode 100644
index 1fdf4cd..0000000
--- a/Viewer/src/TriggerProvider.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-//============================================================================
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 TRIGGERPROVIDER_HPP
-#define TRIGGERPROVIDER_HPP
-
-#include <QObject>
-
-#include "VDir.hpp"
-#include "VInfo.hpp"
-#include "InfoProvider.hpp"
-#include "VTask.hpp"
-#include "VTaskObserver.hpp"
-
-class TriggerProvider : public QObject, public InfoProvider
-{
-//Q_OBJECT
-
-public:
-     explicit TriggerProvider(InfoPresenter* owner);
-
-     void visit(VInfoNode*);
-     void clear();
-
-//private Q_SLOTS:
-//	void slotOutputClientError(QString);
-//    void slotOutputClientProgress(QString,int);
-//	void slotOutputClientFinished();
-
-private:
-   // void fetchDir(ServerHandler*,VNode*);
-    //bool fetchDirViaOutputClient(VNode *n,const std::string& fileName);
-    //VDir_ptr fetchLocalDir(const std::string& path);
-    //OutputDirClient* makeOutputClient(const std::string& host,const std::string& port);
-
-    //OutputDirClient *outClient_;
-};
-
-
-#endif
diff --git a/Viewer/src/TriggerTableModel.cpp b/Viewer/src/TriggerTableModel.cpp
new file mode 100644
index 0000000..a4a4fb9
--- /dev/null
+++ b/Viewer/src/TriggerTableModel.cpp
@@ -0,0 +1,299 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 "TriggerTableModel.hpp"
+
+#include "IconProvider.hpp"
+#include "ServerHandler.hpp"
+#include "VAttribute.hpp"
+#include "VAttributeType.hpp"
+#include "VIcon.hpp"
+#include "VNode.hpp"
+
+#include <QDebug>
+
+TriggerTableModel::TriggerTableModel(Mode mode,QObject *parent) :
+          QAbstractItemModel(parent),
+          tc_(0),      
+          mode_(mode)
+{
+}
+
+TriggerTableModel::~TriggerTableModel()
+{
+}
+
+
+void TriggerTableModel::clearData()
+{
+    beginResetModel();
+    tc_=0;
+    endResetModel();
+}
+
+void TriggerTableModel::beginUpdate()
+{
+	beginResetModel();
+}
+
+void TriggerTableModel::endUpdate()
+{
+	endResetModel();
+}
+
+
+void TriggerTableModel::setTriggerCollector(TriggerTableCollector *tc)
+{
+    //beginResetModel();
+    tc_ = tc;
+    //endResetModel();
+}
+
+bool TriggerTableModel::hasData() const
+{
+    if(tc_)
+		return tc_->size() > 0;
+	else
+		return false;
+}
+
+int TriggerTableModel::columnCount( const QModelIndex& /*parent */) const
+{
+     return 1;
+}
+
+int TriggerTableModel::rowCount( const QModelIndex& parent) const
+{
+	if(!hasData())
+		return 0;
+
+	//Parent is the root:
+	if(!parent.isValid())
+	{
+		return tc_->size();
+	}
+
+	return 0;
+}
+
+Qt::ItemFlags TriggerTableModel::flags ( const QModelIndex & index) const
+{
+	return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+}
+
+QVariant TriggerTableModel::data( const QModelIndex& index, int role ) const
+{   
+    if(!index.isValid() || !hasData() || (role < Qt::UserRole &&
+        role != Qt::DisplayRole && role != Qt::BackgroundRole && role != Qt::TextAlignmentRole &&
+        role != Qt::ToolTipRole && role != Qt::ForegroundRole))
+    {
+		return QVariant();
+	}
+
+	int row=index.row();
+    if(row < 0 || row >= static_cast<int>(tc_->size()))
+		return QVariant();
+
+    //QString id=columns_->id(index.column());
+
+    const std::vector<TriggerTableItem*>& items=tc_->items();
+	VItem *t=items[row]->item();
+    Q_ASSERT(t);
+
+    if(index.column() == 0)
+    {
+        if(VAttribute* a=t->isAttribute())
+        {
+            if(role == Qt::DisplayRole)
+            {
+                QStringList d=a->data();
+                if(VNode* pn=a->parent())
+                    d.append(QString::fromStdString(pn->absNodePath()));
+                return d;
+            }
+            else if(role ==  Qt::ToolTipRole)
+            {
+                return a->toolTip();
+            }
+
+        }
+        else if(VNode* vnode=t->isNode())
+        {
+            if(role == Qt::DisplayRole)
+            {
+                return QString::fromStdString(vnode->absNodePath());
+            }
+            else if(role == Qt::BackgroundRole)
+            {
+                if(vnode->isSuspended())
+                {
+                    QVariantList lst;
+                    lst << vnode->stateColour() << vnode->realStateColour();
+                    return lst;
+                }
+                else
+                    return vnode->stateColour() ;
+            }
+            else if(role == Qt::ForegroundRole)
+                return vnode->stateFontColour();
+
+            else if(role == Qt::ToolTipRole)
+            {
+                QString txt=vnode->toolTip();
+                //txt+=VIcon::toolTip(vnode,icons_);
+                return txt;
+            }
+            else if(role == IconRole)
+            {
+                return VIcon::pixmapList(vnode,0);
+            }
+            else if(role  == NodeTypeRole)
+            {
+                 if(vnode->isTask()) return 2;
+                 else if(vnode->isSuite()) return 0;
+                 else if(vnode->isFamily()) return 1;
+                 else if(vnode->isAlias()) return 3;
+                 return 0;
+            }
+            else if(role  == NodeTypeForegroundRole)
+            {
+                return vnode->typeFontColour();
+            }
+            else if(role  == NodePointerRole)
+            {
+                 return qVariantFromValue((void *) vnode);
+            }
+
+            else if(role  == Qt::TextAlignmentRole)
+            {
+                return( mode_==NodeMode)?Qt::AlignCenter:Qt::AlignLeft;
+            }
+
+        }
+    }
+
+    //We express the table cell background colour through the UserRole. The
+    //BackgroundRole is already used for the node rendering
+    if(role == Qt::UserRole && mode_ != NodeMode)
+    {
+        const std::set<TriggerCollector::Mode>&  modes=items[row]->modes();
+        if(modes.find(TriggerCollector::Normal) != modes.end())
+            return QVariant();
+        else
+            return QColor(239,240,240);
+    }
+
+	return QVariant();
+}
+
+QVariant TriggerTableModel::headerData( const int section, const Qt::Orientation orient , const int role ) const
+{
+	if ( orient != Qt::Horizontal)
+            return QAbstractItemModel::headerData( section, orient, role );
+
+	return QVariant();
+}
+
+QModelIndex TriggerTableModel::index( int row, int column, const QModelIndex & parent ) const
+{
+	if(!hasData() || row < 0 || column < 0)
+	{
+		return QModelIndex();
+	}
+
+	//When parent is the root this index refers to a node or server
+	if(!parent.isValid())
+	{
+		return createIndex(row,column);
+	}
+
+	return QModelIndex();
+
+}
+
+QModelIndex TriggerTableModel::parent(const QModelIndex &child) const
+{
+	return QModelIndex();
+}
+
+VInfo_ptr TriggerTableModel::nodeInfo(const QModelIndex& index)
+{
+	//For invalid index no info is created.
+	if(!index.isValid())
+	{
+		VInfo_ptr res;
+		return res;
+	}
+
+    if(index.row() >=0 && index.row() <= static_cast<int>(tc_->items().size()))
+	{
+        TriggerTableItem* d=tc_->items()[index.row()];
+        return VInfo::createFromItem(d->item());
+    }
+
+    VInfo_ptr res;
+	return res;
+}
+
+QModelIndex TriggerTableModel::itemToIndex(TriggerTableItem *item)
+{
+    if(item)
+    {
+         for(std::size_t i=0; i < tc_->items().size(); i++)
+             if(tc_->items()[i] == item)
+                 return index(i,0);
+    }
+
+    return QModelIndex();
+}
+
+TriggerTableItem* TriggerTableModel::indexToItem(const QModelIndex& index) const
+{
+    if(!hasData())
+        return 0;
+
+    int row=index.row();
+    if(row < 0 || row >= static_cast<int>(tc_->size()))
+        return 0;
+
+    const std::vector<TriggerTableItem*>& items=tc_->items();
+    return items[row];
+}
+
+void TriggerTableModel::nodeChanged(const VNode* node, const std::vector<ecf::Aspect::Type>&)
+{
+    if(!hasData())
+        return;
+
+    int num=tc_->items().size();
+    for(int i=0; i < num; i++)
+    {
+        if(VItem* item=tc_->items()[i]->item())
+        {
+            if(VNode* n=item->isNode())
+            {
+                if(n == node)
+                {
+                    QModelIndex idx=index(i,0);
+                    Q_EMIT dataChanged(idx,idx);
+                }
+            }
+
+            else if(VAttribute* a=item->isAttribute())
+            {
+                if(a->parent() == node)
+                {                                                                              
+                    QModelIndex idx=index(i,0);
+                    Q_EMIT dataChanged(idx,idx);
+                }
+            }
+        }
+    }
+}
diff --git a/Viewer/src/TriggerTableModel.hpp b/Viewer/src/TriggerTableModel.hpp
new file mode 100644
index 0000000..c642938
--- /dev/null
+++ b/Viewer/src/TriggerTableModel.hpp
@@ -0,0 +1,69 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 VIEWER_SRC_TRIGGERTABLEMODEL_HPP_
+#define VIEWER_SRC_TRIGGERTABLEMODEL_HPP_
+
+#include <QAbstractItemModel>
+#include <QColor>
+
+#include "VInfo.hpp"
+#include "TriggerCollector.hpp"
+
+#include "Aspect.hpp"
+
+class NodeQueryResult;
+
+class TriggerTableModel : public QAbstractItemModel
+{
+public:
+    enum Mode {TriggerMode,TriggeredMode,NodeMode};
+
+    explicit TriggerTableModel(Mode mode,QObject *parent=0);
+    ~TriggerTableModel();
+
+    //The custom roles must have the same numerical value as in AbstractNodeModel.hpp because the
+    //core delegate was written to only handle the custom roles it defines!
+    enum CustomItemRole {FilterRole = Qt::UserRole+1, IconRole = Qt::UserRole+2,
+                         NodeTypeRole = Qt::UserRole + 13,
+                         NodeTypeForegroundRole = Qt::UserRole + 14,
+                         NodePointerRole = Qt::UserRole + 17};
+
+   	int columnCount (const QModelIndex& parent = QModelIndex() ) const;
+   	int rowCount (const QModelIndex& parent = QModelIndex() ) const;
+
+   	Qt::ItemFlags flags ( const QModelIndex & index) const;
+   	QVariant data (const QModelIndex& , int role = Qt::DisplayRole ) const;
+   	QVariant headerData(int,Qt::Orientation,int role = Qt::DisplayRole ) const;
+
+   	QModelIndex index (int, int, const QModelIndex& parent = QModelIndex() ) const;
+   	QModelIndex parent (const QModelIndex & ) const;
+
+    TriggerTableCollector* triggerCollector() const {return tc_;}
+    void setTriggerCollector(TriggerTableCollector *tc);
+
+   	void clearData();
+    bool hasData() const;
+
+    void beginUpdate();
+    void endUpdate();
+
+    TriggerTableItem* indexToItem(const QModelIndex&) const;
+    VInfo_ptr nodeInfo(const QModelIndex&);
+    QModelIndex itemToIndex(TriggerTableItem*);
+
+    void nodeChanged(const VNode* node, const std::vector<ecf::Aspect::Type>&);
+
+protected:
+    TriggerTableCollector* tc_;
+    Mode mode_;
+};
+
+#endif /* VIEWER_SRC_TRIGGERTABLEMODEL_HPP_ */
diff --git a/Viewer/src/TriggerTableView.cpp b/Viewer/src/TriggerTableView.cpp
new file mode 100644
index 0000000..a0b77af
--- /dev/null
+++ b/Viewer/src/TriggerTableView.cpp
@@ -0,0 +1,248 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 "TriggerTableView.hpp"
+
+#include <QApplication>
+#include <QDebug>
+#include <QHeaderView>
+#include <QPalette>
+#include <QScrollBar>
+
+#include "ActionHandler.hpp"
+#include "AttributeEditor.hpp"
+#include "NodeQueryResultModel.hpp"
+#include "NodeQueryViewDelegate.hpp"
+#include "TriggerTableModel.hpp"
+#include "TriggerViewDelegate.hpp"
+#include "UiLog.hpp"
+#include "UserMessage.hpp"
+#include "VNode.hpp"
+
+TriggerTableView::TriggerTableView(QWidget* parent) :
+    QTreeView(parent),
+    model_(NULL),
+    needItemsLayout_(false)
+{
+    setProperty("view","trigger");
+
+    actionHandler_=new ActionHandler(this,this);
+
+    //Set the model
+    setModel(model_);
+
+    //Create delegate to the view
+    delegate_=new TriggerViewDelegate(this);
+    setItemDelegate(delegate_);
+
+    connect(delegate_,SIGNAL(sizeHintChangedGlobal()),
+            this,SLOT(slotSizeHintChangedGlobal()));
+
+    setHeaderHidden(true);
+    setRootIsDecorated(false);
+    setAllColumnsShowFocus(true);
+    setUniformRowHeights(true);
+    setMouseTracking(true);
+    setSortingEnabled(false);
+    setSelectionMode(QAbstractItemView::ExtendedSelection);
+
+    //!!!!We need to do it because:
+    //The background colour between the view's left border and the nodes cannot be
+    //controlled by delegates or stylesheets. It always takes the QPalette::Highlight
+    //colour from the palette. Here we set this to transparent so that Qt could leave
+    //this area empty and we will fill it appropriately in our delegate.
+    QPalette pal=palette();
+    pal.setColor(QPalette::Highlight,QColor(128,128,128,0));//Qt::transparent);
+    setPalette(pal);
+
+    //Context menu
+    enableContextMenu(true);
+
+    //Selection
+    connect(this,SIGNAL(clicked(const QModelIndex&)),
+            this,SLOT(slotSelectItem(const QModelIndex&)));
+
+    connect(this,SIGNAL(doubleClicked(const QModelIndex&)),
+            this,SLOT(slotDoubleClickItem(const QModelIndex&)));
+
+}
+
+TriggerTableView::~TriggerTableView()
+{
+    delete actionHandler_;
+}
+
+//We should only call it once!!!
+void TriggerTableView::setModel(TriggerTableModel* model)
+{
+    Q_ASSERT(model_==0);
+    model_=model;
+    QTreeView::setModel(model);  
+}
+
+void TriggerTableView::enableContextMenu(bool enable)
+{
+    if (enable)
+    {
+        setContextMenuPolicy(Qt::CustomContextMenu);
+
+        connect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
+                            this, SLOT(slotContextMenu(const QPoint &)));
+    }
+    else
+    {
+        setContextMenuPolicy(Qt::NoContextMenu);
+
+        disconnect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
+                            this, SLOT(slotContextMenu(const QPoint &)));
+    }
+}
+
+
+//Collects the selected list of indexes
+QModelIndexList TriggerTableView::selectedList()
+{
+    QModelIndexList lst;
+    Q_FOREACH(QModelIndex idx,selectedIndexes())
+    {
+        if(idx.column() == 0)
+            lst << idx;
+    }
+    return lst;
+}
+
+// this is called even if the user clicks outside of the node list to deselect all
+void TriggerTableView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
+{
+    QModelIndexList lst=selectedIndexes();
+    if(lst.count() > 0)
+    {
+        TriggerTableItem* item=model_->indexToItem(lst.front());
+        if(item && item->item())
+        {
+            Q_EMIT selectionChanged(item);
+        }
+    }
+
+    QTreeView::selectionChanged(selected, deselected);
+
+    //Q_EMIT selectionChanged();
+}
+
+void TriggerTableView::slotSelectItem(const QModelIndex&)
+{
+    QModelIndexList lst=selectedIndexes();
+
+    if(lst.count() > 0)
+    {
+        TriggerTableItem* item=model_->indexToItem(lst.front());
+        if(item && item->item())
+        {
+            Q_EMIT clicked(item);
+        }
+    }
+}
+
+void TriggerTableView::setCurrentItem(TriggerTableItem* item)
+{
+    QModelIndex idx=model_->itemToIndex(item);
+    if(idx.isValid())
+    {
+        setCurrentIndex(idx);
+    }
+}
+
+void TriggerTableView::slotDoubleClickItem(const QModelIndex& index)
+{    
+    VInfo_ptr info=model_->nodeInfo(index);
+    if(info)
+    {
+        Q_EMIT linkSelected(info);
+    }
+}
+
+void TriggerTableView::slotContextMenu(const QPoint &position)
+{
+    QModelIndexList lst=selectedList();
+    //QModelIndex index=indexAt(position);
+    QPoint scrollOffset(horizontalScrollBar()->value(),verticalScrollBar()->value());
+
+    handleContextMenu(indexAt(position),lst,mapToGlobal(position),position+scrollOffset,this);
+}
+
+
+void TriggerTableView::handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget)
+{
+    //Node actions
+    if(indexClicked.isValid())   //indexLst[0].isValid() && indexLst[0].column() == 0)
+    {
+        std::vector<VInfo_ptr> nodeLst;
+        for(int i=0; i < indexLst.count(); i++)
+        {
+            VInfo_ptr info=model_->nodeInfo(indexLst[i]);
+            if(info && !info->isEmpty())
+                nodeLst.push_back(info);
+        }
+
+        actionHandler_->contextMenu(nodeLst,globalPos);
+    }
+
+    //Desktop actions
+    else
+    {
+    }
+}
+
+void TriggerTableView::slotViewCommand(VInfo_ptr info,QString cmd)
+{
+    if(cmd == "lookup")
+    {
+        Q_EMIT linkSelected(info);
+    }
+
+    else if(cmd ==  "edit")
+    {
+        if(info && info->isAttribute())
+        {
+            AttributeEditor::edit(info,this);
+        }
+    }
+}
+
+void TriggerTableView::reload()
+{
+    //model_->reload();
+    //expandAll();
+}
+
+void TriggerTableView::rerender()
+{
+    if(needItemsLayout_)
+    {
+        doItemsLayout();
+        needItemsLayout_=false;
+    }
+    else
+    {
+        viewport()->update();
+    }
+}
+
+void TriggerTableView::slotRerender()
+{
+    rerender();
+}
+
+
+void TriggerTableView::slotSizeHintChangedGlobal()
+{
+    needItemsLayout_=true;
+}
+
diff --git a/Viewer/src/TriggerTableView.hpp b/Viewer/src/TriggerTableView.hpp
new file mode 100644
index 0000000..dcccf14
--- /dev/null
+++ b/Viewer/src/TriggerTableView.hpp
@@ -0,0 +1,66 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 TRIGGERTABLEVIEW_HPP
+#define TRIGGERTABLEVIEW_HPP
+
+#include <QTreeView>
+
+#include "VInfo.hpp"
+
+class ActionHandler;
+class NodeQueryResultModel;
+class TriggerViewDelegate;
+class TriggerTableItem;
+class TriggerTableModel;
+
+class TriggerTableView : public QTreeView
+{
+Q_OBJECT
+
+public:
+    explicit TriggerTableView(QWidget *parent=0);
+    ~TriggerTableView();
+
+    void setModel(TriggerTableModel* model);
+
+    void reload();
+    void rerender();
+    void setCurrentItem(TriggerTableItem*);
+    void enableContextMenu(bool enable);
+
+public Q_SLOTS:
+    void slotSelectItem(const QModelIndex&);
+    void slotDoubleClickItem(const QModelIndex&);
+    void slotContextMenu(const QPoint &position);
+    void slotViewCommand(VInfo_ptr,QString);
+    void slotRerender();
+    void slotSizeHintChangedGlobal();
+    void selectionChanged (const QItemSelection &selected, const QItemSelection &deselected);
+
+Q_SIGNALS:
+    void selectionChanged(TriggerTableItem*);
+    void clicked(TriggerTableItem*);
+    void linkSelected(VInfo_ptr);
+    void selectionChanged();
+    void infoPanelCommand(VInfo_ptr,QString);
+    void dashboardCommand(VInfo_ptr,QString);
+
+protected:
+    QModelIndexList selectedList();
+    void handleContextMenu(QModelIndex indexClicked,QModelIndexList indexLst,QPoint globalPos,QPoint widgetPos,QWidget *widget);
+
+    TriggerTableModel* model_;
+    ActionHandler* actionHandler_;
+    bool needItemsLayout_;
+    TriggerViewDelegate* delegate_;
+};
+
+#endif // TRIGGERTABLEVIEW_HPP
diff --git a/Viewer/src/TriggerTableWidget.cpp b/Viewer/src/TriggerTableWidget.cpp
new file mode 100644
index 0000000..ad9b5d9
--- /dev/null
+++ b/Viewer/src/TriggerTableWidget.cpp
@@ -0,0 +1,373 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 "TriggerTableWidget.hpp"
+
+#include "Highlighter.hpp"
+#include "TriggerItemWidget.hpp"
+#include "TriggerTableModel.hpp"
+#include "TriggerViewDelegate.hpp"
+#include "VSettings.hpp"
+
+TriggerTableWidget::TriggerTableWidget(QWidget *parent) :
+    QWidget(parent)
+{
+	setupUi(this);
+
+    nodeCollector_=new TriggerTableCollector(false);
+
+    depInfoCloseTb_->setProperty("triggertitle","1");
+    depInfoCloseTb_->parent()->setProperty("triggertitle","1");
+
+    //Format labels
+    triggerLabel_->setProperty("triggertitle","1");
+    triggeredLabel_->setProperty("triggertitle","1");
+    depLabel_->setProperty("triggertitle","1");
+
+    depLabelText_=tr(" Dependency details");
+    depLabel_->setText(depLabelText_);
+
+    //Node - model + view
+    nodeModel_ = new TriggerTableModel(TriggerTableModel::NodeMode,this);
+    nodeView_->setModel(nodeModel_);
+
+    //Set the height of the node display area
+    QFont fNode;
+    QFontMetrics fm(fNode);
+    nodeView_->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);
+    nodeView_->setFixedHeight(fm.size(0,"A").height()+fm.height()/3);
+
+    //Set the size of the left and right arrow labels
+    leftArrowLabel_->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
+    leftArrowLabel_->setFixedHeight(nodeView_->height());
+    leftArrowLabel_->setFixedWidth(nodeView_->height());
+
+    rightArrowLabel_->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
+    rightArrowLabel_->setFixedHeight(nodeView_->height());
+    rightArrowLabel_->setFixedWidth(nodeView_->height());
+
+    //Trigger - model + view
+    triggerModel_ = new TriggerTableModel(TriggerTableModel::TriggerMode,this);
+    triggerView_->setModel(triggerModel_);
+
+    //triggered - model + view
+    triggeredModel_ = new TriggerTableModel(TriggerTableModel::TriggeredMode,this);
+    triggeredView_->setModel(triggeredModel_);
+
+    //normal selection
+    connect(triggerView_,SIGNAL(selectionChanged(TriggerTableItem*)),
+            this,SLOT(slotTriggerSelection(TriggerTableItem*)));
+
+    connect(triggerView_,SIGNAL(clicked(TriggerTableItem*)),
+            this,SLOT(slotTriggerClicked(TriggerTableItem*)));
+
+    connect(triggeredView_,SIGNAL(selectionChanged(TriggerTableItem*)),
+            this,SLOT(slotTriggeredSelection(TriggerTableItem*)));
+
+    connect(triggeredView_,SIGNAL(clicked(TriggerTableItem*)),
+            this,SLOT(slotTriggeredClicked(TriggerTableItem*)));
+
+    //lookup selection
+    connect(triggerView_,SIGNAL(linkSelected(VInfo_ptr)),
+            this,SIGNAL(linkSelected(VInfo_ptr)));
+
+    connect(triggeredView_,SIGNAL(linkSelected(VInfo_ptr)),
+            this,SIGNAL(linkSelected(VInfo_ptr)));
+
+    //relay commands
+    connect(nodeView_,SIGNAL(infoPanelCommand(VInfo_ptr,QString)),
+            this,SIGNAL(infoPanelCommand(VInfo_ptr,QString)));
+
+    connect(nodeView_,SIGNAL(dashboardCommand(VInfo_ptr,QString)),
+            this,SIGNAL(dashboardCommand(VInfo_ptr,QString)));
+
+    connect(triggerView_,SIGNAL(infoPanelCommand(VInfo_ptr,QString)),
+            this,SIGNAL(infoPanelCommand(VInfo_ptr,QString)));
+
+    connect(triggerView_,SIGNAL(dashboardCommand(VInfo_ptr,QString)),
+            this,SIGNAL(dashboardCommand(VInfo_ptr,QString)));
+
+    connect(triggeredView_,SIGNAL(infoPanelCommand(VInfo_ptr,QString)),
+            this,SIGNAL(infoPanelCommand(VInfo_ptr,QString)));
+
+    connect(triggeredView_,SIGNAL(dashboardCommand(VInfo_ptr,QString)),
+            this,SIGNAL(dashboardCommand(VInfo_ptr,QString)));
+
+    //anchor clicked in text browser
+    connect(depBrowser_,SIGNAL(anchorClicked(const QUrl&)),
+            this,SLOT(anchorClicked(const QUrl&)));
+}
+
+TriggerTableWidget::~TriggerTableWidget()
+{
+    delete nodeCollector_;
+}
+
+void TriggerTableWidget::clear()
+{
+    info_.reset();
+
+    nodeModel_->clearData();
+    triggerModel_->clearData();
+    triggeredModel_->clearData();
+
+    depLabel_->setText(depLabelText_);
+    depBrowser_->clear();
+}
+
+void TriggerTableWidget::clearSelection()
+{
+    lastSelectedItem_.reset();
+}
+
+void TriggerTableWidget::setInfo(VInfo_ptr info)
+{
+    info_=info;
+
+    nodeModel_->beginUpdate();
+    nodeCollector_->clear();
+    if(info_)
+    {
+        nodeCollector_->add(info_->item(),0,TriggerCollector::Normal);
+    }
+    nodeModel_->setTriggerCollector(nodeCollector_);
+    nodeModel_->endUpdate();
+}
+
+void TriggerTableWidget::slotTriggerClicked(TriggerTableItem* item)
+{
+    Q_ASSERT(item);
+
+    if(!depBrowser_->document()->isEmpty() && lastSelectedItem_ && lastSelectedItem_->hasData())
+    {
+        if(item->item() && item->item()->sameContents(lastSelectedItem_->item()))
+            return;
+    }
+
+    slotTriggerSelection(item);
+}
+
+void TriggerTableWidget::slotTriggerSelection(TriggerTableItem* item)
+{
+    Q_ASSERT(item);
+    Q_ASSERT(item->item());
+
+    lastSelectedItem_=VInfo::createFromItem(item->item());
+
+    if(!depInfoWidget_->isVisible())
+        return;
+
+    QString txt=tr("  <TGTYPE> <TG> triggers these parents/children of <CTYPE> <CITEM>");
+    QString tgName,tgType;
+    QColor col(255,255,255);
+
+    VItem* currentItem=0;
+    if(info_)
+        currentItem=info_->item();
+
+    if(currentItem)
+    {
+        tgName=currentItem->name();
+        tgType=QString::fromStdString(currentItem->typeName());
+    }
+    txt.replace("<CITEM>","<font color=\'" + col.name() + "\'><b>" + tgName + "</b></font>");
+    txt.replace("<CTYPE>",tgType);
+
+    tgName.clear();
+    tgType.clear();
+    if(item->item())
+    {
+        tgName=item->item()->name();
+        tgType=QString::fromStdString(item->item()->typeName());
+    }
+    txt.replace("<TG>","<font color=\'" + col.name() + "\'><b>" + tgName + "</b></font>");
+    txt.replace("<TGTYPE>",tgType);
+
+    depLabel_->setText(txt);
+    depBrowser_->reload(item);
+}
+
+
+void TriggerTableWidget::slotTriggeredClicked(TriggerTableItem* item)
+{
+    Q_ASSERT(item);
+
+    if(!depBrowser_->document()->isEmpty() && lastSelectedItem_ && lastSelectedItem_->hasData())
+    {
+        if(item->item() && item->item()->sameContents(lastSelectedItem_->item()))
+            return;
+    }
+
+    slotTriggeredSelection(item);
+}
+
+void TriggerTableWidget::slotTriggeredSelection(TriggerTableItem* item)
+{
+    Q_ASSERT(item);
+    Q_ASSERT(item->item());
+
+    lastSelectedItem_=VInfo::createFromItem(item->item());
+
+    if(!depInfoWidget_->isVisible())
+        return;
+
+    QString txt=tr("  <TYPE> <ITEM> is triggered by these parents/children of <CTYPE> <CITEM>");
+    QString tgType,tgName;
+    QColor col(255,255,255);
+
+    VItem* currentItem=0;
+    if(info_)
+        currentItem=info_->item();
+
+    if(currentItem)
+    {
+        tgName=currentItem->name();
+        tgType=QString::fromStdString(currentItem->typeName());
+    }
+    txt.replace("<CITEM>","<font color=\'" + col.name() + "\'><b>" + tgName + "</b></font>");
+    txt.replace("<CTYPE>",tgType);
+
+    tgName.clear();
+    tgType.clear();
+    if(item->item())
+    {
+        tgName=item->item()->name();
+        tgType=QString::fromStdString(item->item()->typeName());
+    }
+    txt.replace("<ITEM>","<font color=\'" + col.name() + "\'><b>" + tgName + "</b></font>");
+    txt.replace("<TYPE>",tgType);
+
+    depLabel_->setText(txt);
+    depBrowser_->reload(item);
+}
+
+void TriggerTableWidget::slotShowDependencyInfo(bool b)
+{
+    depInfoWidget_->setVisible(b);
+
+    //When the depinfo panel becomes visible we need to update
+    //its contents
+    if(b && lastSelectedItem_  && lastSelectedItem_->hasData())
+    {
+        if(TriggerTableCollector *tc=triggerModel_->triggerCollector())
+        {
+            if(TriggerTableItem *ti=tc->find(lastSelectedItem_->item()))
+            {
+                slotTriggerSelection(ti);
+                return;
+            }
+        }
+        if(TriggerTableCollector *tc=triggeredModel_->triggerCollector())
+        {
+            if(TriggerTableItem *ti=tc->find(lastSelectedItem_->item()))
+            {
+                slotTriggeredSelection(ti);
+                return;
+            }
+        }
+    }
+}
+
+void TriggerTableWidget::on_depInfoCloseTb__clicked()
+{
+    if(depInfoWidget_->isVisible())
+        Q_EMIT  depInfoWidgetClosureRequested();
+}
+
+void TriggerTableWidget::anchorClicked(const QUrl& link)
+{
+    VInfo_ptr info=VInfo::createFromPath(info_->server(),link.toString().toStdString());
+    if(info)
+        Q_EMIT linkSelected(info);
+}
+
+void TriggerTableWidget::beginTriggerUpdate()
+{
+    triggerModel_->beginUpdate();
+    triggeredModel_->beginUpdate();
+}
+
+void TriggerTableWidget::endTriggerUpdate()
+{
+    triggerModel_->endUpdate();
+    triggeredModel_->endUpdate();
+}
+
+void TriggerTableWidget::setTriggerCollector(TriggerTableCollector *tc1,TriggerTableCollector *tc2)
+{
+    triggerModel_->setTriggerCollector(tc1);
+    triggeredModel_->setTriggerCollector(tc2);
+}
+
+void TriggerTableWidget::resumeSelection()
+{
+    //try to reselect the last selected item
+    if(lastSelectedItem_)
+    {
+        lastSelectedItem_->regainData();
+        if(lastSelectedItem_->hasData())
+        {
+            if(TriggerTableCollector* tc=triggerModel_->triggerCollector())
+            {
+                if(TriggerTableItem* ti=tc->findByContents(lastSelectedItem_->item()))
+                {
+                    triggerView_->setCurrentItem(ti);
+                    return;
+                }
+            }
+
+            if(TriggerTableCollector* tc=triggeredModel_->triggerCollector())
+            {
+                if(TriggerTableItem* ti=tc->findByContents(lastSelectedItem_->item()))
+                {
+                    triggeredView_->setCurrentItem(ti);
+                    return;
+                }
+            }
+        }
+        else
+        {
+            lastSelectedItem_.reset();
+        }
+    }
+}
+
+void TriggerTableWidget::nodeChanged(const VNode* node, const std::vector<ecf::Aspect::Type>& aspect)
+{
+    //The node view only contains one item (=info_) so we simply rerender it to get the
+    //update
+    if(info_ && info_->node() == node)
+        nodeView_->rerender();
+
+    triggerModel_->nodeChanged(node,aspect);
+    triggeredModel_->nodeChanged(node,aspect);
+}
+
+
+void TriggerTableWidget::writeSettings(VComboSettings* vs)
+{
+    vs->beginGroup("triggerTable");
+    vs->putQs("splitter1",splitter1_->saveState());
+    vs->putQs("splitter2",splitter2_->saveState());
+    vs->endGroup();
+}
+
+void TriggerTableWidget::readSettings(VComboSettings* vs)
+{
+    vs->beginGroup("triggerTable");
+    if(vs->containsQs("splitter1"))
+    {
+        splitter1_->restoreState(vs->getQs("splitter1").toByteArray());
+    }
+    if(vs->containsQs("splitter2"))
+    {
+        splitter2_->restoreState(vs->getQs("splitter2").toByteArray());
+    }
+    vs->endGroup();
+}
diff --git a/Viewer/src/TriggerTableWidget.hpp b/Viewer/src/TriggerTableWidget.hpp
new file mode 100644
index 0000000..2fb7197
--- /dev/null
+++ b/Viewer/src/TriggerTableWidget.hpp
@@ -0,0 +1,73 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 TRIGGERTABLEWIDGET_HPP_
+#define TRIGGERTABLEWIDGET_HPP_
+
+#include <QDialog>
+#include "VInfo.hpp"
+
+#include "Aspect.hpp"
+
+#include "ui_TriggerTableWidget.h"
+
+class TriggerTableItem;
+class TriggerTableModel;
+class TriggerTableCollector;
+class TriggerItemWidget;
+class VComboSettings;
+
+class TriggerTableWidget : public QWidget, private Ui::triggerTableWidget
+{
+	Q_OBJECT
+
+public:
+    explicit TriggerTableWidget(QWidget *parent = 0);
+    ~TriggerTableWidget();
+
+    void setInfo(VInfo_ptr);
+    void setTriggerCollector(TriggerTableCollector *tc1,TriggerTableCollector *tc2);
+	void clear();
+    void clearSelection();
+    void resumeSelection();
+    void beginTriggerUpdate();
+    void endTriggerUpdate();
+    void nodeChanged(const VNode* node, const std::vector<ecf::Aspect::Type>& aspect);
+    void writeSettings(VComboSettings* vs);
+    void readSettings(VComboSettings* vs);
+
+public Q_SLOTS:
+    void slotShowDependencyInfo(bool);
+
+protected Q_SLOTS:
+    void slotTriggerSelection(TriggerTableItem* item);
+    void slotTriggerClicked(TriggerTableItem*);
+    void slotTriggeredSelection(TriggerTableItem* item);
+    void slotTriggeredClicked(TriggerTableItem*);
+    void on_depInfoCloseTb__clicked();
+    void anchorClicked(const QUrl& link);
+
+Q_SIGNALS:
+    void linkSelected(VInfo_ptr);
+    void infoPanelCommand(VInfo_ptr,QString);
+    void dashboardCommand(VInfo_ptr,QString);
+    void depInfoWidgetClosureRequested();
+
+private:
+    VInfo_ptr info_;
+    TriggerTableCollector* nodeCollector_;
+    TriggerTableModel *nodeModel_;
+    TriggerTableModel *triggerModel_;
+    TriggerTableModel *triggeredModel_;
+    VInfo_ptr lastSelectedItem_;
+    QString depLabelText_;
+};
+
+#endif
diff --git a/Viewer/src/TriggerTableWidget.ui b/Viewer/src/TriggerTableWidget.ui
new file mode 100644
index 0000000..a681378
--- /dev/null
+++ b/Viewer/src/TriggerTableWidget.ui
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>triggerTableWidget</class>
+ <widget class="QWidget" name="triggerTableWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>940</width>
+    <height>579</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_4" stretch="0,1">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QWidget" name="nodeHolderW" native="true">
+     <layout class="QHBoxLayout" name="horizontalLayout_3" stretch="0,1,0">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QLabel" name="leftArrowLabel_">
+        <property name="text">
+         <string/>
+        </property>
+        <property name="pixmap">
+         <pixmap resource="viewer.qrc">:/viewer/trigger_left_arrow.svg</pixmap>
+        </property>
+        <property name="scaledContents">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="TriggerTableView" name="nodeView_"/>
+      </item>
+      <item>
+       <widget class="QLabel" name="rightArrowLabel_">
+        <property name="text">
+         <string/>
+        </property>
+        <property name="pixmap">
+         <pixmap resource="viewer.qrc">:/viewer/trigger_right_arrow.svg</pixmap>
+        </property>
+        <property name="scaledContents">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QSplitter" name="splitter1_">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="handleWidth">
+      <number>2</number>
+     </property>
+     <property name="childrenCollapsible">
+      <bool>true</bool>
+     </property>
+     <widget class="QSplitter" name="splitter2_">
+      <property name="orientation">
+       <enum>Qt::Horizontal</enum>
+      </property>
+      <property name="handleWidth">
+       <number>2</number>
+      </property>
+      <property name="childrenCollapsible">
+       <bool>false</bool>
+      </property>
+      <widget class="QWidget" name="layoutWidget">
+       <layout class="QVBoxLayout" name="verticalLayout_2">
+        <property name="spacing">
+         <number>2</number>
+        </property>
+        <item>
+         <widget class="QLabel" name="triggerLabel_">
+          <property name="text">
+           <string><html><head/><body><p><span style=" font-weight:600;">Triggers of</span> the selected node</p></body></html></string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="TriggerTableView" name="triggerView_">
+          <property name="itemsExpandable">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="layoutWidget1">
+       <layout class="QVBoxLayout" name="verticalLayout">
+        <property name="spacing">
+         <number>2</number>
+        </property>
+        <item>
+         <widget class="QLabel" name="triggeredLabel_">
+          <property name="text">
+           <string>&nbsp;Nodes <b>triggered by</b> the selected node</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="TriggerTableView" name="triggeredView_"/>
+        </item>
+       </layout>
+      </widget>
+     </widget>
+     <widget class="QWidget" name="depInfoWidget_" native="true">
+      <layout class="QVBoxLayout" name="verticalLayout_3" stretch="0,1">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0">
+         <item>
+          <widget class="QLabel" name="label">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="maximumSize">
+            <size>
+             <width>16</width>
+             <height>16</height>
+            </size>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+           <property name="pixmap">
+            <pixmap resource="viewer.qrc">:/viewer/dock_dependency.svg</pixmap>
+           </property>
+           <property name="scaledContents">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="depLabel_">
+           <property name="text">
+            <string><html><head/><body><p><br/></p></body></html></string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QToolButton" name="depInfoCloseTb_">
+           <property name="toolTip">
+            <string>Close</string>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+           <property name="icon">
+            <iconset resource="viewer.qrc">
+             <normaloff>:/viewer/images/dock_close.svg</normaloff>:/viewer/images/dock_close.svg</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>16</width>
+             <height>16</height>
+            </size>
+           </property>
+           <property name="autoRaise">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="TriggerTextWidget" name="depBrowser_"/>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>TriggerTextWidget</class>
+   <extends>QTextBrowser</extends>
+   <header>TriggerTextWidget.hpp</header>
+  </customwidget>
+  <customwidget>
+   <class>TriggerTableView</class>
+   <extends>QTreeView</extends>
+   <header>TriggerTableView.hpp</header>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="viewer.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/Viewer/src/TriggerTextWidget.cpp b/Viewer/src/TriggerTextWidget.cpp
index 5425521..54b27ac 100644
--- a/Viewer/src/TriggerTextWidget.cpp
+++ b/Viewer/src/TriggerTextWidget.cpp
@@ -12,6 +12,9 @@
 #include <QFile>
 #include <QTextStream>
 
+#include "TriggerCollector.hpp"
+#include "VItemPathParser.hpp"
+
 TriggerTextWidget::TriggerTextWidget(QWidget* parent) : QTextBrowser(parent)
 {
     setOpenExternalLinks(false);
@@ -32,5 +35,44 @@ TriggerTextWidget::TriggerTextWidget(QWidget* parent) : QTextBrowser(parent)
     document()->setDefaultStyleSheet(cssDoc);
 }
 
+void TriggerTextWidget::reload(TriggerTableItem* item)
+{
+    QString s="<table width=\'100%\'>";
+    s+=makeHtml(item,"Triggers directly triggering the selected node","Triggers");
+    s+="</table>";
+    setHtml(s);
+}
+
+QString TriggerTextWidget::makeHtml(TriggerTableItem *ti,QString directTitle,QString modeText) const
+{
+    QString s;
+    const std::vector<TriggerDependencyItem>& items=ti->dependencies();
+
+    for(unsigned int i=0; i < items.size(); i++)
+    {
+        VItem *t=items[i].dep();
+        TriggerCollector::Mode mode=items[i].mode();
+
+        if(!t)
+            continue;
+
+        s+="<tr><td>";
+        if(mode == TriggerCollector::Parent)
+           s+="parent";
+        else
+           s+="child";
+
+        QString type=QString::fromStdString(t->typeName());
+        QString path=QString::fromStdString(t->fullPath());
+        QString anchor=QString::fromStdString(VItemPathParser::encode(t->fullPath(),t->typeName()));
+
+        s+="  " + type;
+        //s+=" <a class=\'chp\' href=\'" + anchor + "\'>" + path +"</a>";
+        s+=" <a href=\'" + anchor + "\'>" + path +"</a>";
+        s+="</td></tr>";
+    }
+
+    return s;
+}
 
 
diff --git a/Viewer/src/TriggerTextWidget.hpp b/Viewer/src/TriggerTextWidget.hpp
index 11fb926..19510f3 100644
--- a/Viewer/src/TriggerTextWidget.hpp
+++ b/Viewer/src/TriggerTextWidget.hpp
@@ -12,10 +12,16 @@
 
 #include <QTextBrowser>
 
+class TriggerTableItem;
+
 class TriggerTextWidget : public QTextBrowser
 {
 public:
     explicit TriggerTextWidget(QWidget *parent=0);
+    void reload(TriggerTableItem* item);
+
+private:
+    QString makeHtml(TriggerTableItem *ti,QString directTitle,QString modeText) const;
 };
 
 #endif
diff --git a/Viewer/src/TriggerView.cpp b/Viewer/src/TriggerView.cpp
deleted file mode 100644
index 0400eb6..0000000
--- a/Viewer/src/TriggerView.cpp
+++ /dev/null
@@ -1,516 +0,0 @@
-//============================================================================
-// Copyright 2009-2017 ECMWF.
-// This software is licensed under the terms of the Apache Licence version 2.0
-// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
-// In applying this licence, ECMWF does not 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 "TriggerView.hpp"
-
-#include "VNode.hpp"
-
-NodeItem::NodeItem()
-{
-
-}
-
-QRectF NodeItem::boundingRect() const
-{
-    return QRectF();
-}
-
-void paint(QPainter*, const QStyleOptionGraphicsItem *,QWidget*)
-{
-
-}
-
-
-
-TriggerScene::TriggerScene(QWidget *parent) : QGraphicsScene(parent)
-{
-}
-
-void TriggerScene::reset(VInfo_ptr info)
-{
-	clear();
-
-}
-
-/*int TriggerScene::grow(VInfo_ptr info,bool)
-{
-
-}*/
-
-
-TriggerView::TriggerView(QWidget *parent) : QGraphicsView(parent)
-{
-
-}
-
-
-
-
-
-
-
-////////////////////////////////////////////////////////////////////////
-/*
-
-class TriggerListItem
-{
-public:
-    std::string type_;
-    std::string name_;
-    std::string path_;
-protected:
-
-};
-
-class TriggerCollector
-{
-public:
-    TriggerCollector() {}
-    virtual ~TriggerCollector() {}
-
-    enum Mode { Normal    = 0,   // Normal trigger_node
-                Parent    = 1,   // Through parent
-                Child     = 2,   // Through child
-                Hierarchy = 3    // Through child
-    }
-
-    virtual void add(VItem*, VNode*,Mode,VNode*) = 0;
-    virtual bool scanParents() { return false; }
-    virtual bool scnaKids()    { return false; }
-    virtual bool scanSelf()    { return true; }
-
-private:
-    TriggerCollector(const trigger_lister&);
-    TriggerCollector& operator=(const trigger_lister&);
-
-    std::vector<VItem*> items_;
-};
-
-
-
-class TriggerListCollector : public TriggerCollector
-{
-public:
-    TriggerListCollector(FILE* f,const std::string& *title,bool extended) :
-        file_(f), title_(t), extended_(extended) {}
-
-    void add(VItem*, VNode*,Mode,VNode*);
-    bool scanParents() { return extended_; }
-    bool scanKids() { return extended_; }
-
-protected:
-    //panel& p_;
-    FILE* file_;
-    std::string title_;
-    bool extended_;
-    std::vector<VItem*> items_;
-};
-
-void InfoLister::add(VItem* n, VNode* parent,Mode mode,VNode*)
-{
-    items_.push_back(n);
-
-
-#if 0
-    // Title
-    if(title_)
-    {
-            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_);
-#endif
-}
-
-
-
-class fik : public TriggerList
-{
-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);
-        }
-    }
-
-private:
-  node*     n_;
-  node*     k_;
-  trigger_lister& l_;
-};
-
-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); }
-};
-
-
-*/
-
-
-
-/*
-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 visitFunction(AstFunction*){}
-  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);
-        }
-      }
-    }
-  }
-}
-
-
-//Get the triggers list for the Triggers view
-void simple_node::triggers(trigger_lister& tlr)
-{
-	//Check the node itself
-	if(tlr.self())
-	{
-		if(node_ && !node_->isSuite())
-		{
-			std::set<VNode*> theSet;
-			std::set<VNode*>::iterator sit;
-			AstCollateXNodesVisitor astVisitor(theSet);
-
-			if(node_->completeAst())
-				node_->completeAst()->accept(astVisitor);
-
-			if(node_->triggerAst())
-				node_->triggerAst()->accept(astVisitor);
-
-			for (sit = theSet.begin(); sit != theSet.end(); ++sit)
-				tlr.next_node( *(*sit), 0, trigger_lister::normal, *sit);
-     }
-
-
-     for(std::vector<VNode*>::itertor it=children_.begin(); it!= 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);
-  }
-
-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_);
-  }
-};
-
-*/
-
-
-
-
-
diff --git a/Viewer/src/TriggerViewDelegate.cpp b/Viewer/src/TriggerViewDelegate.cpp
new file mode 100644
index 0000000..038f425
--- /dev/null
+++ b/Viewer/src/TriggerViewDelegate.cpp
@@ -0,0 +1,176 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 "TriggerViewDelegate.hpp"
+
+#include <QApplication>
+#include <QDebug>
+#include <QImageReader>
+#include <QLinearGradient>
+#include <QPainter>
+
+#include "AbstractNodeModel.hpp"
+#include "Animation.hpp"
+#include "FontMetrics.hpp"
+#include "IconProvider.hpp"
+#include "PropertyMapper.hpp"
+#include "ServerHandler.hpp"
+#include "UiLog.hpp"
+
+static std::vector<std::string> propVec;
+
+#if 0
+static QColor typeFgColourClassic=QColor(Qt::white);
+static QColor typeBgColourClassic=QColor(150,150,150);
+static QColor childCountColour=QColor(90,91,92);
+#endif
+
+struct TriggerNodeDelegateBox : public NodeDelegateBox
+{
+    TriggerNodeDelegateBox() {
+        topMargin=2;
+        bottomMargin=2;
+        leftMargin=2;
+        rightMargin=2;
+        topPadding=0;
+        bottomPadding=0;
+        leftPadding=2;
+        rightPadding=2;
+      }
+};
+
+struct TriggerAttrDelegateBox : public AttrDelegateBox
+{
+    TriggerAttrDelegateBox() {
+        topMargin=2;
+        bottomMargin=2;
+        leftMargin=2;
+        rightMargin=2;
+        topPadding=0;
+        bottomPadding=0;
+        leftPadding=2;
+        rightPadding=0;
+      }
+};
+
+TriggerViewDelegate::TriggerViewDelegate(QWidget *parent) :
+    TreeNodeViewDelegate(0,parent)
+{
+    //borderPen_=QPen(QColor(230,230,230));
+    borderPen_=QPen(QColor(220,220,220));
+
+    nodeBox_=new TriggerNodeDelegateBox;
+    attrBox_=new TriggerAttrDelegateBox;
+
+    nodeBox_->adjust(font_);
+    attrBox_->adjust(attrFont_);
+
+    //Property
+    if(propVec.empty())
+    {
+        //Base settings
+        addBaseSettings(propVec);
+    }
+
+    prop_=new PropertyMapper(propVec,this);
+
+    updateSettings();
+}
+
+TriggerViewDelegate::~TriggerViewDelegate()
+{
+}
+
+void TriggerViewDelegate::updateSettings()
+{
+    //Update the settings handled by the base class
+    updateBaseSettings();
+}
+
+QSize TriggerViewDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex & index ) const
+{
+    return nodeBox_->sizeHintCache;
+}
+
+void TriggerViewDelegate::paint(QPainter *painter,const QStyleOptionViewItem &option,
+                   const QModelIndex& index) const
+{
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+    QStyleOptionViewItem vopt(option);
+#else
+    QStyleOptionViewItemV4 vopt(option);
+#endif
+
+    initStyleOption(&vopt, index);
+
+    //const QStyle *style = vopt.widget ? vopt.widget->style() : QApplication::style();
+    //const QWidget* widget = vopt.widget;
+
+    //Save painter state
+    painter->save();
+
+    //Background
+    QColor bgcol=index.data(Qt::UserRole).value<QColor>();
+    if(bgcol.isValid())
+        painter->fillRect(vopt.rect,bgcol);
+
+    if(index.column() == 0)
+    {
+        QVariant tVar=index.data(Qt::DisplayRole);
+        painter->setFont(font_);
+
+        //Node
+        if(tVar.type() == QVariant::String)
+        {
+            QString text=index.data(Qt::DisplayRole).toString();
+
+            //If the textalignment is AlignCenter we node is displayed
+            //as centered in the opt rect!
+            QVariant vTa=index.data(Qt::TextAlignmentRole);
+            if(!vTa.isNull())
+            {
+                if(vTa.toInt() == Qt::AlignCenter)
+                {
+                    int w=nodeWidth(index,text);
+                    int dw=(vopt.rect.width()-w)/2;
+                    if(dw > 0)
+                        vopt.rect.moveLeft(dw);
+                }
+            }
+
+            renderNode(painter,index,vopt,text);
+        }
+
+        //Render attributes
+        else if(tVar.type() == QVariant::StringList)
+        {
+            QStringList lst=tVar.toStringList();
+            if(lst.count() > 0)
+            {
+                QMap<QString,AttributeRendererProc>::const_iterator it=attrRenderers_.find(lst.at(0));
+                if(it != attrRenderers_.end())
+                {
+                    QSize size;
+                    AttributeRendererProc a=it.value();
+                    (this->*a)(painter,lst,vopt,size);
+                }
+            }
+        }
+    }
+
+    //Render the horizontal border for rows. We only render the top border line.
+    //With this technique we miss the bottom border line of the last row!!!
+    //QRect fullRect=QRect(0,option.rect.y(),painter->device()->width(),option.rect.height());
+    QRect bgRect=option.rect;
+    painter->setPen(borderPen_);
+    painter->drawLine(bgRect.topLeft(),bgRect.topRight());
+
+    painter->restore();
+}
+
diff --git a/Viewer/src/CompactNodeViewDelegate.hpp b/Viewer/src/TriggerViewDelegate.hpp
similarity index 56%
rename from Viewer/src/CompactNodeViewDelegate.hpp
rename to Viewer/src/TriggerViewDelegate.hpp
index 8fb1105..4a9f8f2 100644
--- a/Viewer/src/CompactNodeViewDelegate.hpp
+++ b/Viewer/src/TriggerViewDelegate.hpp
@@ -8,29 +8,37 @@
 //
 //============================================================================
 
-#ifndef COMPACTNODEVIEWDELEGATE_HPP
-#define COMPACTNODEVIEWDELEGATE_HPP
+#ifndef TRIGGERVIEWDELEGATE_HPP
+#define TRIGGERVIEWDELEGATE_HPP
 
-#include "TreeNodeViewDelegateBase.hpp"
+#include <QBrush>
+#include <QMap>
+#include <QPen>
+#include <QStyledItemDelegate>
+#include <QStyleOptionViewItem>
 
-class CompactNodeViewDelegate : public TreeNodeViewDelegateBase
+#include "TreeNodeViewDelegate.hpp"
+#include "VProperty.hpp"
+
+#include <string>
+
+class ModelColumn;
+
+class TriggerViewDelegate : public TreeNodeViewDelegate
 {
 public:
-    explicit CompactNodeViewDelegate(TreeNodeModel* model,QWidget *parent=0);
-    ~CompactNodeViewDelegate();
+    explicit TriggerViewDelegate(QWidget *parent=0);
+    ~TriggerViewDelegate();
 
+    QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index ) const;
     void paint(QPainter *painter,const QStyleOptionViewItem &option,
-                   const QModelIndex& index) const {}
-
-    int paintItem(QPainter *painter,const QStyleOptionViewItem &option,
                    const QModelIndex& index) const;
 
-    QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex& index ) const;
-    void sizeHint(const QModelIndex& index,int& w,int& h) const;
-    bool isSingleHeight(int h) const;
-};
-
-#endif // COMPACTNODEVIEWDELEGATE_HPP
+protected:
+    void updateSettings();
 
+    QPen borderPen_;
 
+};
 
+#endif // TRIGGERVIEWDELEGATE_HPP
diff --git a/Viewer/src/UIDebug.hpp b/Viewer/src/UIDebug.hpp
index 1af0a9b..6d434a2 100644
--- a/Viewer/src/UIDebug.hpp
+++ b/Viewer/src/UIDebug.hpp
@@ -17,15 +17,11 @@
 class UIDebug
 {
 public:
-	UIDebug() {};
-   ~UIDebug() {};
-
+    UIDebug() {}
+   ~UIDebug() {}
 
 	static void uiAssert(char const* expr, char const* file, long line, const std::string& message);
 	static std::string longToString(long num);
-
-
-
 };
 
 
diff --git a/Viewer/src/UiLog.cpp b/Viewer/src/UiLog.cpp
index c244f69..baf8c45 100644
--- a/Viewer/src/UiLog.cpp
+++ b/Viewer/src/UiLog.cpp
@@ -27,6 +27,57 @@
 
 static LogTruncator *truncator=0;
 
+//---------------------------------
+// UiFunctionLog
+//---------------------------------
+
+UiFunctionLog::UiFunctionLog(ServerHandler* server,const std::string& funcName) :
+    funcName_(funcName)
+{
+    if(server)
+        serverName_=server->longName();
+
+    init();
+    UiLog(serverName_).dbg() << logEnter();
+}
+
+UiFunctionLog::UiFunctionLog(const std::string& funcName) :
+    funcName_(funcName)
+{
+    init();
+    UiLog(serverName_).dbg() << logEnter();
+}
+
+UiFunctionLog::~UiFunctionLog()
+{
+    UiLog(serverName_).dbg() << logLeave();
+}
+
+void UiFunctionLog::init()
+{
+    std::size_t pos;
+    if((pos=funcName_.find_first_of("(")) != std::string::npos)
+    {
+        std::size_t pos1=funcName_.rfind(" ",pos);
+        if(pos1 != std::string::npos && pos1+1  < pos)
+            funcName_=funcName_.substr(pos1+1,pos-pos1-1);
+    }
+}
+
+std::string UiFunctionLog::logEnter() const
+{
+    return funcName_ + " -->";
+}
+
+std::string UiFunctionLog::logLeave() const
+{
+    return "<-- " + funcName_;
+}
+
+//---------------------------------
+// UiLog
+//---------------------------------
+
 UiLog::UiLog(ServerHandler* sh) :
     type_(INFO), server_(sh->longName())
 {}
@@ -101,6 +152,7 @@ void UiLog::enableTruncation()
                                      86400*1000,10*1024*1024,1000);
 }
 
+
 //------------------------------------------
 // Overload ostringstream for qt objects
 //------------------------------------------
diff --git a/Viewer/src/UiLog.hpp b/Viewer/src/UiLog.hpp
index 12adc3a..58b5846 100644
--- a/Viewer/src/UiLog.hpp
+++ b/Viewer/src/UiLog.hpp
@@ -23,12 +23,31 @@ class QRect;
 
 class ServerHandler;
 
+#define UI_FUNCTION_LOG UiFunctionLog __fclog(BOOST_CURRENT_FUNCTION);
+#define UI_FUNCTION_LOG_S(server) UiFunctionLog __fclog(server,BOOST_CURRENT_FUNCTION);
+
+class UiFunctionLog
+{
+public:
+    UiFunctionLog(ServerHandler* server,const std::string& funcName);
+    UiFunctionLog(const std::string& funcName);
+    ~UiFunctionLog();
+
+    std::string logEnter() const;
+    std::string logLeave() const;
+protected:
+    void init();
+
+    std::string serverName_;
+    std::string funcName_;
+};
+
 class UiLog
 {
 public:
    enum Type {INFO,WARN,ERROR,DBG};
 
-   UiLog() : type_(INFO) {}
+   UiLog() : type_(INFO) {}   
    UiLog(ServerHandler* server);
    UiLog(const std::string& server);
    ~UiLog();
diff --git a/Viewer/src/VAttribute.cpp b/Viewer/src/VAttribute.cpp
index b3bb235..75bf42f 100644
--- a/Viewer/src/VAttribute.cpp
+++ b/Viewer/src/VAttribute.cpp
@@ -29,6 +29,12 @@ VAttribute::~VAttribute()
 {
 }
 
+ServerHandler* VAttribute::server() const
+{
+    return (parent_)?parent_->server():NULL;
+}
+
+
 VServer* VAttribute::root() const
 {
     return (parent_)?parent_->root():NULL;
@@ -71,9 +77,10 @@ bool VAttribute::sameContents(VItem* item) const
         return false;
 
     if(VAttribute *a=item->isAttribute())
-    {    return a->parent() == parent() &&
+    {
+        return a->parent() == parent() &&
                 a->type() == type() &&
-                name() == name();
+                a->name() == name();
     }
     return false;
 }
@@ -149,4 +156,3 @@ void VAttribute::buildAlterCommand(std::vector<std::string>& cmd,
 
     cmd.push_back("<full_name>");
 }
-
diff --git a/Viewer/src/VAttribute.hpp b/Viewer/src/VAttribute.hpp
index 9b68426..2830bca 100644
--- a/Viewer/src/VAttribute.hpp
+++ b/Viewer/src/VAttribute.hpp
@@ -31,6 +31,7 @@ public:
     virtual VAttributeType* type() const=0;
     virtual const std::string& subType() const;
     virtual int lineNum() const {return 1;}
+    ServerHandler* server() const;
     VServer* root() const;
     VAttribute* isAttribute() const {return const_cast<VAttribute*>(this);}
     QString toolTip() const;
diff --git a/Viewer/src/VAttributeType.cpp b/Viewer/src/VAttributeType.cpp
index c410228..aeba54d 100644
--- a/Viewer/src/VAttributeType.cpp
+++ b/Viewer/src/VAttributeType.cpp
@@ -63,7 +63,7 @@ VAttributeType* VAttributeType::find(const std::string& name)
 
 VAttributeType* VAttributeType::find(int id)
 {
-    assert(id >=0  && id < types_.size());
+    assert(id >=0  && id < static_cast<int>(types_.size()));
     return types_[id];
 }
 
diff --git a/Viewer/src/VConfig.cpp b/Viewer/src/VConfig.cpp
index a2c11f7..f966ae8 100644
--- a/Viewer/src/VConfig.cpp
+++ b/Viewer/src/VConfig.cpp
@@ -306,7 +306,7 @@ void VConfig::saveSettings(const std::string& parFile,VProperty* guiProp,VSettin
 		{
 			if((*it)->changed())
 			{
-				pt.put((*it)->path(),(*it)->valueAsString());
+                pt.put((*it)->path(),(*it)->valueAsStdString());
 			}
 		}
 
@@ -314,7 +314,7 @@ void VConfig::saveSettings(const std::string& parFile,VProperty* guiProp,VSettin
 		{
 			if(!(*it)->useMaster())
 			{
-				pt.put((*it)->path(),(*it)->valueAsString());
+                pt.put((*it)->path(),(*it)->valueAsStdString());
 			}
 		}
 	}
diff --git a/Viewer/src/VDateAttr.cpp b/Viewer/src/VDateAttr.cpp
index 7d5a00c..627d578 100644
--- a/Viewer/src/VDateAttr.cpp
+++ b/Viewer/src/VDateAttr.cpp
@@ -92,13 +92,13 @@ QStringList VDateAttr::data(bool /*firstLine*/) const
         if(dataType_ == DateData)
         {
             const std::vector<DateAttr>& v=parent_->node_->dates();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 atype->encode(v[index_],s);
         }
         else if(dataType_ == DayData)
         {
             const std::vector<DayAttr>& v=parent_->node_->days();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 atype->encode(v[index_],s);
         }
     }
@@ -112,13 +112,13 @@ std::string VDateAttr::strName() const
         if(dataType_ == DateData)
         {
             const std::vector<DateAttr>& v=parent_->node_->dates();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 return v[index_].name();
         }
         else if(dataType_ == DayData)
         {
             const std::vector<DayAttr>& v=parent_->node_->days();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 return v[index_].name();
         }
     }
@@ -132,14 +132,14 @@ void VDateAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
         const std::vector<DateAttr>& dateV=vnode->node_->dates();
         const std::vector<DayAttr>& dayV=vnode->node_->days();
 
-        int n=dateV.size();
-        for(size_t i=0; i < n; i++)
+        int n=static_cast<int>(dateV.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VDateAttr(vnode,dateV[i],i));
         }
 
-        n=dayV.size();
-        for(size_t i=0; i < n; i++)
+        n=static_cast<int>(dayV.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VDateAttr(vnode,dayV[i],i));
         }
diff --git a/Viewer/src/VDir.cpp b/Viewer/src/VDir.cpp
index 7c49a3b..a979137 100644
--- a/Viewer/src/VDir.cpp
+++ b/Viewer/src/VDir.cpp
@@ -92,7 +92,7 @@ void VDir::reload()
 std::string VDir::fullName(int row)
 {
 	std::string res;
-	if(row >=0 && row < items_.size())
+    if(row >=0 && row < static_cast<int>(items_.size()))
 	{
 		res=DirectoryHandler::concatenate(path_,items_.at(row)->name_);
 	}
diff --git a/Viewer/src/VEventAttr.cpp b/Viewer/src/VEventAttr.cpp
index d180a08..d303d08 100644
--- a/Viewer/src/VEventAttr.cpp
+++ b/Viewer/src/VEventAttr.cpp
@@ -101,8 +101,8 @@ void VEventAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
     if(vnode->node_)
     {
         const std::vector<Event>& v=vnode->node_->events();
-        int n=v.size();
-        for(size_t i=0; i < n; i++)
+        int n=static_cast<int>(v.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VEventAttr(vnode,v[i],i));
         }
diff --git a/Viewer/src/VFilter.cpp b/Viewer/src/VFilter.cpp
index 893ef50..630fff5 100644
--- a/Viewer/src/VFilter.cpp
+++ b/Viewer/src/VFilter.cpp
@@ -481,7 +481,7 @@ bool TreeNodeFilter::isComplete()
 bool TreeNodeFilter::update(const std::vector<VNode*>& topChange,std::vector<VNode*>& topFilterChange)
 {
 #ifdef _UI_VFILTER_DEBUG
-    UiLog(server_).dbg() << "TreeNodeFilter::update -->";
+    UI_FUNCTION_LOG_S(server_);
 #endif
 
     //nodes_.clear();
@@ -509,7 +509,7 @@ bool TreeNodeFilter::update(const std::vector<VNode*>& topChange,std::vector<VNo
         bool fullRun=false;
 
         //The number of nodes changed: we need to rerun everything
-        if(match_.size() != root->totalNum() || match_.size() != tree_->nodeVec().size())
+        if(static_cast<int>(match_.size()) != root->totalNum() || match_.size() != tree_->nodeVec().size())
         {
             //Deallocates the match vector
             match_=std::vector<VNode*>();
@@ -532,7 +532,7 @@ bool TreeNodeFilter::update(const std::vector<VNode*>& topChange,std::vector<VNo
         //We rerun everything
         if(fullRun)
         {
-            for(size_t i=0; i < root->numOfChildren(); i++)
+            for(int i=0; i < root->numOfChildren(); i++)
             {
                 filterState(root->childAt(i),def_->nodeState_);
             }
@@ -569,7 +569,7 @@ bool TreeNodeFilter::update(const std::vector<VNode*>& topChange,std::vector<VNo
             }
 
 #ifdef _UI_VFILTER_DEBUG
-            assert(topFilterChange.size() <= diffCnt);
+            assert(static_cast<int>(topFilterChange.size()) <= diffCnt);
             if(diffCnt > 0)
                 assert(topFilterChange.size() >0);
 #endif
@@ -593,10 +593,6 @@ bool TreeNodeFilter::update(const std::vector<VNode*>& topChange,std::vector<VNo
     UiLog(server_).dbg() << " capacity:" << match_.capacity();
 #endif
 
-#ifdef _UI_VFILTER_DEBUG
-    UiLog(server_).dbg() << "<-- update";
-#endif
-
     return true;
 }
 
@@ -617,7 +613,7 @@ bool TreeNodeFilter::collectTopFilterChange(VNode* node,std::vector<VNode*>& top
         return true;
     }
 
-    for(unsigned int i=0; i < node->numOfChildren(); i++)
+    for(int i=0; i < node->numOfChildren(); i++)
     {
         if(collectTopFilterChange(node->childAt(i),topFilterChange))
         {
@@ -637,7 +633,7 @@ bool TreeNodeFilter::filterState(VNode* node,VParamSet* stateFilter)
         ok=true;
     }
 
-    for(unsigned int i=0; i < node->numOfChildren(); i++)
+    for(int i=0; i < node->numOfChildren(); i++)
     {
         if(filterState(node->childAt(i),stateFilter) == true && ok == false)
         {
@@ -771,7 +767,7 @@ bool TableNodeFilter::update()
      matchMode_=VectorMatch;
      match_.clear();
      int num=server_->vRoot()->totalNum();
-     if(num != index_.size())
+     if(num != static_cast<int>(index_.size()))
      {
         //Reallocates
         index_=std::vector<int>();
diff --git a/Viewer/src/VGenVarAttr.cpp b/Viewer/src/VGenVarAttr.cpp
index 0b4a551..7cefa12 100644
--- a/Viewer/src/VGenVarAttr.cpp
+++ b/Viewer/src/VGenVarAttr.cpp
@@ -30,7 +30,15 @@ VGenVarAttrType::VGenVarAttrType() : VAttributeType("genvar")
 
 QString VGenVarAttrType::toolTip(QStringList d) const
 {
-   return QString();
+    QString t="<b>Type:</b> User variable<br>";
+    if(d.count() == dataCount_)
+    {
+        t+="<b>Name:</b> " + d[NameIndex] + "<br>";
+        QString s=d[ValueIndex];
+        if(s.size() > 150) s=s.left(150) + "...";
+        t+="<b>Value:</b> " + s;
+    }
+    return t;
 }
 
 void VGenVarAttrType::encode(const Variable& v,QStringList& data) const
@@ -87,11 +95,18 @@ void VGenVarAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
     {
         std::vector<Variable> v;
         vnode->genVariables(v);
-        int n=v.size();
-        for(size_t i=0; i < n; i++)
+        int n=static_cast<int>(v.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VGenVarAttr(vnode,v[i],i));
         }
     }
 }
 
+bool VGenVarAttr::isReadOnly(const std::string& varName)
+{
+    static QStringList readOnlyVars=QStringList() <<
+                 "ECF_NODE" << "ECF_HOST" << "ECF_PORT" << "ECF_PID" <<
+                 "ECF_VERSION" << "ECF_LISTS";
+    return readOnlyVars.contains(QString::fromStdString(varName));
+}
diff --git a/Viewer/src/VGenVarAttr.hpp b/Viewer/src/VGenVarAttr.hpp
index bdaa92d..a3ec236 100644
--- a/Viewer/src/VGenVarAttr.hpp
+++ b/Viewer/src/VGenVarAttr.hpp
@@ -42,8 +42,8 @@ public:
     VAttributeType* type() const;
     QStringList data(bool firstLine) const;
     std::string strName() const;
-
     static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+    static bool isReadOnly(const std::string&);
 };
 
 #endif // VGENVARATTR_HPP
diff --git a/Viewer/src/VInfo.cpp b/Viewer/src/VInfo.cpp
index 4dd8674..08afc0d 100644
--- a/Viewer/src/VInfo.cpp
+++ b/Viewer/src/VInfo.cpp
@@ -54,25 +54,26 @@ VInfo::~VInfo()
 
 void VInfo::notifyServerDelete(ServerHandler* /*server*/)
 {
-	//This function is called from the server destructor. We do not remove this object from the ServerObservers
-
     server_=0;
     node_=0;
     attr_=0;
 
+    //This function is called from the server destructor. We do not remove this object from the ServerObservers
 	dataLost();
 }
 
 void VInfo::dataLost()
 {
-	std::vector<VInfoObserver*> obsTmp=observers_;
+    std::vector<VInfoObserver*> obsTmp=observers_;
 	observers_.clear();
 
 	for(std::vector<VInfoObserver*>::iterator it=obsTmp.begin(); it != obsTmp.end(); ++it)
 	{
 		VInfoObserver* o=*it;
 		o->notifyDataLost(this);
-	}
+    }
+
+    attr_=0;
 }
 
 void VInfo::notifyBeginServerClear(ServerHandler* server)
@@ -151,7 +152,10 @@ void VInfo::regainData()
 std::string VInfo::storedNodePath() const
 {
      VItemPathParser p(storedPath_);
-     return p.node();
+     if(p.itemType() == VItemPathParser::ServerType)
+         return "/";
+     else
+         return p.node();
 }
 
 void VInfo::addObserver(VInfoObserver* o)
@@ -254,6 +258,27 @@ VInfo_ptr VInfo::createFromPath(const std::string& path)
     return VInfo_ptr();
 }
 
+VInfo_ptr VInfo::createFromItem(VItem* item)
+{
+    if(!item)
+        return VInfo_ptr();
+
+    if(VServer* s=item->isServer())
+    {
+        return VInfoServer::create(s->server());
+    }
+    else if(VNode* n=item->isNode())
+    {
+        return VInfoNode::create(n);
+    }
+    else if(VAttribute* a=item->isAttribute())
+    {
+        return VInfoAttribute::create(a);
+    }
+
+    return VInfo_ptr();
+}
+
 //=========================================
 //
 // VInfoServer
@@ -363,6 +388,14 @@ std::string VInfoNode::serverAlias()
     return p;
 }
 
+std::string VInfoNode::nodePath()
+{
+    std::string p;
+    if(node_ && node_->node())
+        p = node_->absNodePath();
+    return p;
+}
+
 std::string VInfoNode::relativePath()
 {
     std::string p;
@@ -426,8 +459,16 @@ std::string VInfoAttribute::path()
     if(server_)
        p=server_->name();
     if(attr_)
-        p+=attr_->fullPath();
+        p+=":/" + attr_->fullPath();
+
+    return p;
+}
 
+std::string VInfoAttribute::nodePath()
+{
+    std::string p;
+    if(node_ && node_->node())
+        p = node_->absNodePath();
     return p;
 }
 
diff --git a/Viewer/src/VInfo.hpp b/Viewer/src/VInfo.hpp
index 9eb0f47..428e707 100644
--- a/Viewer/src/VInfo.hpp
+++ b/Viewer/src/VInfo.hpp
@@ -62,6 +62,7 @@ public:
     virtual std::string path()=0;
     virtual std::string serverAlias() {return "";}
     virtual std::string relativePath() {return "";}
+    virtual std::string nodePath()=0;
     std::string storedNodePath() const;
     const std::string& storedPath() const {return storedPath_;}
 
@@ -87,6 +88,7 @@ public:
     static VInfo_ptr createParent(VInfo_ptr);
     static VInfo_ptr createFromPath(ServerHandler*,const std::string&);
     static VInfo_ptr createFromPath(const std::string& path);
+    static VInfo_ptr createFromItem(VItem*);
 
 protected:
     VInfo(ServerHandler* server,VNode* node,VAttribute* attr=0);
@@ -112,6 +114,7 @@ public:
     void accept(VInfoVisitor*);   
     std::string name();
     std::string path();
+    std::string nodePath() {return "/";}
     static VInfo_ptr create(ServerHandler*);
 
 protected:
@@ -130,7 +133,8 @@ public:
     std::string path();  
 	std::string name();	
 	std::string serverAlias();
-	std::string relativePath();
+    std::string nodePath();
+    std::string relativePath();
     VItem* item() const;
 
     static VInfo_ptr create(VNode*);
@@ -152,6 +156,7 @@ public:
     void accept(VInfoVisitor*);
     std::string name();
     std::string path();
+    std::string nodePath();
     VItem* item() const;
 
     static VInfo_ptr create(VAttribute*);
diff --git a/Viewer/src/VItem.hpp b/Viewer/src/VItem.hpp
index 0fd74b1..f3ad334 100644
--- a/Viewer/src/VItem.hpp
+++ b/Viewer/src/VItem.hpp
@@ -39,6 +39,7 @@ public:
     virtual VAliasNode* isAlias() const {return NULL;}
     virtual VAttribute* isAttribute() const {return NULL;}
 
+    virtual ServerHandler* server() const=0;
     virtual VServer* root() const=0;
     virtual bool isTopLevel() const {return false;}
     virtual std::string strName() const=0;
diff --git a/Viewer/src/VItemPathParser.cpp b/Viewer/src/VItemPathParser.cpp
index ff7351a..65ee361 100644
--- a/Viewer/src/VItemPathParser.cpp
+++ b/Viewer/src/VItemPathParser.cpp
@@ -9,6 +9,7 @@
 //============================================================================
 
 #include "VItemPathParser.hpp"
+#include "VAttributeType.hpp"
 
 VItemPathParser::VItemPathParser(const std::string& path) : itemType_(NoType)
 {
@@ -50,6 +51,17 @@ VItemPathParser::VItemPathParser(const std::string& path) : itemType_(NoType)
         node_=p.substr(0,pos);
         attribute_=p.substr(pos+1);
         itemType_=AttributeType;
+
+        if(type_ == "gen-variable")
+            type_="genvar";
+        else if(type_ == "user-variable")
+            type_="var";
+
+        if(!VAttributeType::find(type_))
+        {
+            itemType_=NoType;
+            type_.clear();
+        }
     }
     else
     {
@@ -73,3 +85,13 @@ std::string VItemPathParser::encodeWithServer(const std::string& server,const st
 
     return "[" + type + "]" + server + ":/" + path;
 }
+
+std::string VItemPathParser::encodeAttribute(const std::string& parentPath,const std::string& attrName,const std::string& attrType)
+{
+    if(attrType.empty())
+        return std::string();
+
+    VItemPathParser parent(parentPath);
+
+    return "[" + attrType + "]" + parent.server() + ":/" + parent.node() + ":" + attrName;
+}
diff --git a/Viewer/src/VItemPathParser.hpp b/Viewer/src/VItemPathParser.hpp
index 17dc253..d5eac43 100644
--- a/Viewer/src/VItemPathParser.hpp
+++ b/Viewer/src/VItemPathParser.hpp
@@ -26,9 +26,10 @@ public:
     const std::string node() const {return node_;}
     const std::string attribute() const {return attribute_;}
 
-    static std::string encode(const std::string& path,const std::string& type);
+    static std::string encode(const std::string& path,const std::string& type);    
     static std::string encodeWithServer(const std::string& server,const std::string& path,
                                         const std::string& type);
+    static std::string encodeAttribute(const std::string& parentPath,const std::string& attrName,const std::string& attrType);
 
 protected:
     ItemType itemType_;
diff --git a/Viewer/src/VLabelAttr.cpp b/Viewer/src/VLabelAttr.cpp
index 6019344..107f864 100644
--- a/Viewer/src/VLabelAttr.cpp
+++ b/Viewer/src/VLabelAttr.cpp
@@ -60,8 +60,7 @@ void VLabelAttrType::encode(const Label& label,QStringList& data,bool firstLine)
     {
         std::size_t pos=val.find("\n");
         if(pos != std::string::npos)
-        {
-            if(pos > 0) pos--;
+        {            
             val=val.substr(0,pos);
         }
     }
@@ -131,8 +130,8 @@ void VLabelAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
     if(vnode->node_)
     {
         const std::vector<Label>& v=vnode->node_->labels();
-        int n=v.size();
-        for(size_t i=0; i < n; i++)
+        int n=static_cast<int>(v.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VLabelAttr(vnode,v[i],i));
         }
diff --git a/Viewer/src/VLimitAttr.cpp b/Viewer/src/VLimitAttr.cpp
index bde4047..c2cdbfe 100644
--- a/Viewer/src/VLimitAttr.cpp
+++ b/Viewer/src/VLimitAttr.cpp
@@ -147,8 +147,8 @@ void VLimitAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
     if(vnode->node_)
     {
         const std::vector<limit_ptr>& v=vnode->node_->limits();
-        int n=v.size();
-        for(size_t i=0; i < n; i++)
+        int n=static_cast<int>(v.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VLimitAttr(vnode,v[i],i));
         }
diff --git a/Viewer/src/VLimiterAttr.cpp b/Viewer/src/VLimiterAttr.cpp
index 2a2b815..84ee70d 100644
--- a/Viewer/src/VLimiterAttr.cpp
+++ b/Viewer/src/VLimiterAttr.cpp
@@ -100,8 +100,8 @@ void VLimiterAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
     if(vnode->node_)
     {
         const std::vector<InLimit>& v=vnode->node_->inlimits();
-        int n=v.size();
-        for(size_t i=0; i < n; i++)
+        int n=static_cast<int>(v.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VLimiterAttr(vnode,v[i],i));
         }
diff --git a/Viewer/src/VMeterAttr.cpp b/Viewer/src/VMeterAttr.cpp
index a12ec25..6593f5b 100644
--- a/Viewer/src/VMeterAttr.cpp
+++ b/Viewer/src/VMeterAttr.cpp
@@ -102,8 +102,8 @@ void VMeterAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
     if(vnode->node_)
     {
         const std::vector<Meter>& v=vnode->node_->meters();
-        int n=v.size();
-        for(size_t i=0; i < n; i++)
+        int n=static_cast<int>(v.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VMeterAttr(vnode,v[i],i));
         }
diff --git a/Viewer/src/VModelData.cpp b/Viewer/src/VModelData.cpp
index ddd9536..8de5696 100644
--- a/Viewer/src/VModelData.cpp
+++ b/Viewer/src/VModelData.cpp
@@ -10,6 +10,7 @@
 #include "VModelData.hpp"
 
 #include "AbstractNodeModel.hpp"
+#include "ExpandState.hpp"
 #include "NodeQuery.hpp"
 #include "VFilter.hpp"
 #include "ServerHandler.hpp"
@@ -79,7 +80,8 @@ VTreeServer::VTreeServer(ServerHandler *server,NodeFilterDef* filterDef,Attribut
    attrFilter_(attrFilter),
    firstScan_(true),
    firstScanTryNo_(0),
-   maxFirstScanTry_(10)
+   maxFirstScanTry_(10),
+   expandState_(0)
 {
     tree_=new VTree(this);
     filter_=new TreeNodeFilter(filterDef,server_,tree_);
@@ -92,6 +94,8 @@ VTreeServer::~VTreeServer()
     delete tree_;
     delete changeInfo_;
     delete filter_;
+    if(expandState_)
+        delete expandState_;
 }
 
 NodeFilter* VTreeServer::filter() const
@@ -151,6 +155,9 @@ void VTreeServer::notifyBeginServerScan(ServerHandler* server,const VServerChang
 
 void VTreeServer::notifyEndServerScan(ServerHandler* /*server*/)
 {
+#ifdef _UI_VMODELDATA_DEBUG
+    UI_FUNCTION_LOG_S(server_)
+#endif
     UI_ASSERT(tree_->numOfChildren() == 0, "num: " << tree_->numOfChildren());
 
     //We still must be in inScan mode so that the model should think
@@ -212,16 +219,13 @@ void VTreeServer::notifyServerActivityChanged(ServerHandler* server)
 void VTreeServer::notifyEndServerSync(ServerHandler* server)
 {
 #ifdef _UI_VMODELDATA_DEBUG
-   UiLog(server_).dbg() << "VTreeServer::notifyEndServerSync --> number of state changes: " <<
+    UI_FUNCTION_LOG_S(server_)
+    UiLog(server_).dbg() << " number of state changes=" <<
                            changeInfo_->stateChangeSuites().size();
 #endif
 
     updateFilter(changeInfo_->stateChangeSuites());
     changeInfo_->clear();
-
-#ifdef _UI_VMODELDATA_DEBUG
-    UiLog(server_).dbg() << "<-- notifyEndServerSync";
-#endif
 }
 
 //--------------------------------------------------
@@ -230,6 +234,9 @@ void VTreeServer::notifyEndServerSync(ServerHandler* server)
 
 void VTreeServer::notifyBeginNodeChange(const VNode* vnode, const std::vector<ecf::Aspect::Type>& aspect, const VNodeChange& change)
 {
+#ifdef _UI_VMODELDATA_DEBUG
+    UI_FUNCTION_LOG_S(server_)
+#endif
     if(vnode==NULL)
 		return;
 
@@ -239,7 +246,7 @@ void VTreeServer::notifyBeginNodeChange(const VNode* vnode, const std::vector<ec
 	bool nodeNumCh=(std::find(aspect.begin(),aspect.end(),ecf::Aspect::ADD_REMOVE_NODE) != aspect.end());
 
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog(server_).dbg() << "VTreeServer::notifyBeginNodeChange -->" << vnode->strName();
+    UiLog(server_).dbg() << " node=" << vnode->strName();
 #endif
 
 	//-----------------------------------------------------------------------
@@ -362,6 +369,10 @@ void VTreeServer::notifyEndNodeChange(const VNode* vnode, const std::vector<ecf:
 
 void VTreeServer::reload()
 {
+#ifdef _UI_VMODELDATA_DEBUG
+    UI_FUNCTION_LOG
+#endif
+
     changeInfo_->clear();
 
     Q_EMIT beginServerClear(this,-1);
@@ -389,7 +400,6 @@ void VTreeServer::reload()
     adjustFirstScan();
 }
 
-
 void VTreeServer::attrFilterChanged()
 {   
     //In the tree root the attrNum must be cached/initialised
@@ -412,14 +422,22 @@ void VTreeServer::attrFilterChanged()
 
 //This is called when a normal sync (neither reset nor rescan) is finished. We have delayed the update of the
 //filter to this point but now we need to do it.
+//It is also called when a forceShowNode is set.
+//
+//The vector suitesChanged contains all the suites in which a change happened. The filter
+//will only be updated for the branches of these nodes.
 void VTreeServer::updateFilter(const std::vector<VNode*>& suitesChanged)
 {
+#ifdef _UI_VMODELDATA_DEBUG
+    UI_FUNCTION_LOG_S(server_)
+#endif
+
     //if there was a state change during the sync
     if(suitesChanged.size() > 0 && !filter_->isNull() && !filter_->isComplete())
     {
-#ifdef _UI_VMODELDATA_DEBUG
-        UiLog(server_).dbg() << "VTreeServer::updateFilter -->";
-        UiLog(server_).dbg() << " suites changed:";
+#ifdef _UI_VMODELDATA_DEBUG      
+        if(suitesChanged.size() < 0)
+            UiLog(server_).dbg() << " suites changed:";
         for(size_t i= 0; i < suitesChanged.size(); i++)
             UiLog(server_).dbg() << "  " << suitesChanged[i]->strName();
 #endif
@@ -431,7 +449,8 @@ void VTreeServer::updateFilter(const std::vector<VNode*>& suitesChanged)
         filter_->update(suitesChanged,topFilterChange);
 
 #ifdef _UI_VMODELDATA_DEBUG
-        UiLog(server_).dbg() << " top level nodes that changed in filter:";
+        if(topFilterChange.size() > 0)
+            UiLog(server_).dbg() << " top level nodes that changed in filter:";
         for(size_t i= 0; i < topFilterChange.size(); i++)
             UiLog(server_).dbg() << "  " << topFilterChange.at(i)->strName();
 #endif
@@ -534,37 +553,49 @@ void VTreeServer::updateFilter(const std::vector<VNode*>& suitesChanged)
 
 
 //Set the forceShowNode and rerun the filter. The forceShowNode is a node that
-//has to be visible even if it does not match the status filter.
+//has to be visible even if it does not match the status filter. There can be at most one
+//forceShowNode at any time.
 void VTreeServer::setForceShowNode(const VNode* node)
 {
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog(server_).dbg()  << "setForceShowNode -->";
+    UI_FUNCTION_LOG_S(server_)
 #endif
 
-    if(filter_->isNull() || tree_->find(node))
+    Q_ASSERT(node);
+
+    if(node == filter_->forceShowNode())
+        return;
+
+    //There is no status filter
+    if(filter_->isNull())
     {
-        clearForceShow(node);
+        filter_->setForceShowNode(const_cast<VNode*>(node));
         return;
     }
+    //We have a status filter. We need to rerun it for the 
+    //branch of the forceShow node
+    else
+    {
+        //find the suite of the node
+        VNode* s=node->suite();
+        Q_ASSERT(s);
+        Q_ASSERT(s->isTopLevel());
 
-    Q_ASSERT(node);
-
-    //find the suite
-    VNode* s=node->suite();
-    Q_ASSERT(s);
-    Q_ASSERT(s->isTopLevel());
+        std::vector<VNode*> sv;
+        sv.push_back(s);
 
-    std::vector<VNode*> sv;
-    sv.push_back(s);
+        //modify the filter definition
+        filter_->setForceShowNode(const_cast<VNode*>(node));
 
-    filter_->setForceShowNode(const_cast<VNode*>(node));
-    updateFilter(sv);
+        //run the filter
+        updateFilter(sv);
+    }
 }
 
 void VTreeServer::setForceShowAttribute(const VAttribute* a)
 {
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog(server_).dbg() << "setForceShowAttribute";
+    UI_FUNCTION_LOG_S(server_)
 #endif
 
     Q_ASSERT(a);
@@ -577,8 +608,6 @@ void VTreeServer::setForceShowAttribute(const VAttribute* a)
     UiLog(server_).dbg() << "  node=" << node << " Attr=" << a->name() << " type=" << a->typeName();
 #endif
 
-    UI_ASSERT(!node || !attrFilter_->isSet(a->type()),
-              "node=" << node << " Attr=" << a->name().toStdString() << " type=" << a->typeName());
     //Clear
     clearForceShow(a);
 
@@ -586,7 +615,7 @@ void VTreeServer::setForceShowAttribute(const VAttribute* a)
     UiLog(server_).dbg() << "  node after clear=" << node;
 #endif
 
-    //clearForce might remove node, so we need to find it again!
+    //clearForce might have removed the node, so we need to find it again!
     node=tree_->find(vnode);
 
     //Tell the attribute filter that this attribute must always be visible
@@ -642,8 +671,7 @@ void VTreeServer::setForceShowAttribute(const VAttribute* a)
             //This is the attribute num we store in the tree node
             //(and display in the tree).
             //int cachedNum=node->attrNum(attrFilter_);
-            Q_ASSERT(cachedNum >= 0);
-            Q_ASSERT(currentNum >= cachedNum);
+            Q_ASSERT(cachedNum >= 0);           
 
 #ifdef _UI_VMODELDATA_DEBUG
             UiLog(server_).dbg() << "  currentNum=" << currentNum << " cachedNum=" << cachedNum;
@@ -665,23 +693,51 @@ void VTreeServer::setForceShowAttribute(const VAttribute* a)
                 Q_EMIT attributesChanged(this,node);
             }
         }
+        else
+        {
+            //Tell the attribute filter that this attribute must always be visible
+            attrFilter_->setForceShowAttr(const_cast<VAttribute*>(a));
+        }
+    }
+}
+
+void VTreeServer::setForceShow(const VItem* item)
+{
+    if(!item)
+        return;
+
+    //Get the server
+    if(item->server() == server_)
+    {
+        if(VNode *n=item->isNode())
+        {
+            setForceShowNode(n);
+        }
+        else if(VAttribute* a=item->isAttribute())
+        {
+            setForceShowAttribute(a);
+        }
     }
 }
 
-void VTreeServer::clearForceShow(const VItem* itemCurrent)
+
+//Clear the forceShow if it does not match itemNext, which is the the next item 
+//to be set as forceShow
+void VTreeServer::clearForceShow(const VItem* itemNext)
 {
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog().dbg() << "clearForceShow -->";
+    UI_FUNCTION_LOG_S(server_)
 #endif
 
-    if(!itemCurrent)
+    if(!itemNext)
         return;
 
-    //filter_ is unique for each VTreeServer while attrFilter_ is
+    //The stateFilter is unique for each VTreeServer while the AttrFilter is
     //shared by the servers!
     VNode* vnPrev=filter_->forceShowNode();
     VAttribute* aPrev=attrFilter_->forceShowAttr();
 
+    //If there is a forceShowAttribute
     if(aPrev)
     {
         Q_ASSERT(aPrev->parent()->server());
@@ -696,34 +752,37 @@ void VTreeServer::clearForceShow(const VItem* itemCurrent)
             aPrev=0;
     }
 
+    //No forceShowNode or forceShow attribute is set. There is nothing to clear!
     if(!vnPrev && !aPrev)
         return;
 
-    //We need to figure out if item is the same as what we
+    //We need to figure out if itemNext is the same foreceShow that we
     //currently store because in this case there is nothing to do.
 
-    //The server matches
-    //TODO: what if it is the ROOT?
-    ServerHandler *sh=0;
-    if(VNode *parent=itemCurrent->parent())
-        sh=parent->server();
-    else if(VServer* vs=itemCurrent->isServer())
-        sh=vs->server();
+    //Get the server
+    ServerHandler *sh=itemNext->server();
 
+    //The server matches
     if(sh == server_)
-    {        
-        //Item is a node and it is the same as we store
-        if(VNode *itn=itemCurrent->isNode())
+    {
+        //itemNext is a node and it is the same that we store
+        if(VNode *itn=itemNext->isNode())
         {
-            if(itn == vnPrev && !aPrev)
-                return;
+            //The current forceShow is a node
+            if(!aPrev)
+            {
+                //it is the same that we store or no state filter is defined
+                if(itn == vnPrev || filter_->isNull())
+                    return;
+            }
         }
-        //Item is an attribute
-        if(VAttribute *ita=itemCurrent->isAttribute())
+        //itemNext is an attribute
+        if(VAttribute *ita=itemNext->isAttribute())
         {
             if(aPrev)
             {
-                //The attribute is in the current branch or
+                //The attribute is in the current branch and both the current and next 
+                //attribute type is filtered
                 if(ita->parent() == aPrev->parent() &&
                    attrFilter_->isSet(aPrev->type()) && attrFilter_->isSet(ita->type()))
                 {
@@ -735,14 +794,20 @@ void VTreeServer::clearForceShow(const VItem* itemCurrent)
                     return;
                 }
             }
+            //The item is an attribute (child) of the current showForceNode
+            else if(vnPrev && vnPrev == ita->parent())
+                return;
         }
     }
 
-    //Need to handle the attribute if the tree node is visible
+    //Need to remove the current showForce attribute
     if(aPrev)
     {
+        //Remove the current showForce attribute from the attribute filter
         attrFilter_->clearForceShowAttr();
 
+        //Rebuild the branch of the current showForce node with the 
+        //current attribute filter
         VTreeNode *node=tree_->find(vnPrev);
         if(node)
         {
@@ -759,19 +824,19 @@ void VTreeServer::clearForceShow(const VItem* itemCurrent)
 
             Q_EMIT beginAddRemoveAttributes(this,node,currentNum,cachedNum);
 
-            //We update the attribute num in the tree node
+            //Update the attribute num in the tree node
             node->updateAttrNum(attrFilter_);
 
             //This will trigger rerendering the attributes of the given node
             //even if currentNum and cachedNum are the same.
             Q_EMIT endAddRemoveAttributes(this,node,currentNum,cachedNum);
-
         }
     }
 
-    //Reload the node status filter
+    //Remove the current showForce node from the node status filter
     filter_->clearForceShowNode();
 
+    //Reload the node status filter
     VNode* s=vnPrev->suite();
     Q_ASSERT(s->isTopLevel());
     Q_ASSERT(s);
@@ -779,10 +844,17 @@ void VTreeServer::clearForceShow(const VItem* itemCurrent)
     std::vector<VNode*> sv;
     sv.push_back(s);
 
-    //!!!!This can call clearForceShow again!!!
     updateFilter(sv);
 }
 
+void VTreeServer::setExpandState(ExpandState* es)
+{
+    if(expandState_)
+        delete expandState_;
+
+    expandState_=es;
+}
+
 //==========================================
 //
 // VTableServer
@@ -894,7 +966,7 @@ void VTableServer::notifyEndNodeChange(const VNode* node, const std::vector<ecf:
 void VTableServer::reload()
 {
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog(server_).dbg() << "VTableServer::reload -->";
+    UI_FUNCTION_LOG_S(server_)
 #endif
 
     int oriNodeNum=nodeNum();
@@ -917,7 +989,6 @@ void VTableServer::reload()
 
 #ifdef _UI_VMODELDATA_DEBUG
     UiLog(server_).dbg() << " nodeNum: " << oriNodeNum;
-    UiLog(server_).dbg() << "<-- reload";
 #endif
 }
 
@@ -1009,11 +1080,13 @@ VModelData::VModelData(NodeFilterDef *filterDef,AbstractNodeModel* model) :
     connect(this,SIGNAL(serverRemoveEnd(int)),
             model_,SLOT(slotServerRemoveEnd(int)));
 
+#if 0
     connect(this,SIGNAL(filterChangeBegun()),
             model_,SIGNAL(filterChangeBegun()));
 
     connect(this,SIGNAL(filterChangeEnded()),
            model_,SIGNAL(filterChangeEnded()));
+#endif
 
 }
 
@@ -1075,7 +1148,7 @@ void VModelData::addToServers(VModelServer* s)
 void VModelData::clear()
 {
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog().dbg() << "VModelData::clear --> " << this << " filter=" << serverFilter_;
+    UI_FUNCTION_LOG
 #endif
 
     if(serverFilter_)
@@ -1083,32 +1156,28 @@ void VModelData::clear()
 
     serverFilter_=NULL;
 
-	for(int i=0; i < servers_.size(); i++)
+    for(std::size_t i=0; i < servers_.size(); i++)
 	{
         delete servers_[i];
 	}
 
 	servers_.clear();
     serverNum_=0;
-
-#ifdef _UI_VMODELDATA_DEBUG
-    UiLog().dbg() << "<-- clear";
-#endif
 }
 
 VModelServer* VModelData::server(int n) const
 {
-    return (n >=0 && n < servers_.size())?servers_[n]:0;
+    return (n >=0 && n < static_cast<int>(servers_.size()))?servers_[n]:0;
 }
 
 ServerHandler* VModelData::serverHandler(int n) const
 {
-    return (n >=0 && n < servers_.size())?servers_[n]->server_:0;
+    return (n >=0 && n < static_cast<int>(servers_.size()))?servers_[n]->server_:0;
 }
 
 int VModelData::indexOfServer(void* idPointer) const
 {
-	for(unsigned int i=0; i < servers_.size(); i++)
+    for(std::size_t i=0; i < servers_.size(); i++)
         if(servers_[i] == idPointer)
 			return i;
 
@@ -1117,7 +1186,7 @@ int VModelData::indexOfServer(void* idPointer) const
 
 ServerHandler* VModelData::serverHandler(void* idPointer) const
 {
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
         if(servers_[i] == idPointer)
             return servers_[i]->server_;
 
@@ -1126,7 +1195,7 @@ ServerHandler* VModelData::serverHandler(void* idPointer) const
 
 VModelServer* VModelData::server(const void* idPointer) const
 {
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
         if(servers_[i] == idPointer)
             return servers_[i];
 
@@ -1135,7 +1204,7 @@ VModelServer* VModelData::server(const void* idPointer) const
 
 VModelServer* VModelData::server(const std::string& name) const
 {
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
         if(servers_[i]->server_->name()  == name)
             return servers_[i];
 
@@ -1144,7 +1213,7 @@ VModelServer* VModelData::server(const std::string& name) const
 
 VModelServer* VModelData::server(ServerHandler* s) const
 {
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
         if(servers_[i]->server_ == s)
             return servers_[i];
 
@@ -1154,7 +1223,7 @@ VModelServer* VModelData::server(ServerHandler* s) const
 
 int VModelData::indexOfServer(ServerHandler* s) const
 {
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
         if(servers_[i]->server_ == s)
 			return i;
 	return -1;
@@ -1192,7 +1261,7 @@ void VModelData::notifyServerFilterAdded(ServerItem* item)
 void VModelData::notifyServerFilterRemoved(ServerItem* item)
 {
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog().dbg() << "VModelData::notifyServerFilterRemoved --> ";
+    UI_FUNCTION_LOG
 #endif
 
     if(!item)
@@ -1228,10 +1297,6 @@ void VModelData::notifyServerFilterRemoved(ServerItem* item)
 		}
 		i++;
     }
-
-#ifdef _UI_VMODELDATA_DEBUG
-     UiLog().dbg() << "<-- notifyServerFilterRemoved";
-#endif
 }
 
 void VModelData::notifyServerFilterChanged(ServerItem* item)
@@ -1242,7 +1307,7 @@ void VModelData::notifyServerFilterChanged(ServerItem* item)
 void VModelData::notifyServerFilterDelete()
 {
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog().dbg() << "VModelData::notifyServerFilterDelete --> " << this;
+    UI_FUNCTION_LOG
 #endif
 
 #ifdef _UI_VMODELDATA_DEBUG
@@ -1257,11 +1322,6 @@ void VModelData::notifyServerFilterDelete()
 #endif
 
 	Q_EMIT filterDeleteEnd();
-
-#ifdef _UI_VMODELDATA_DEBUG
-    UiLog().dbg() << "<-- notifyServerFilterDelete";
-#endif
-
 }
 
 //Should only be called once at the beginning
@@ -1271,49 +1331,39 @@ void VModelData::setActive(bool active)
     {
         active_=active;
         if(active_)
-            reload(false);
+            reload();
         else
             clear();
     }
 }
 
-void VModelData::reload(bool broadcast)
+void VModelData::reload()
 {
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog().dbg() << "VModelData::reload -->";
+    UI_FUNCTION_LOG
 #endif
 
     Q_ASSERT(active_);
 
-    if(broadcast)
-        Q_EMIT filterChangeBegun();
-
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
     {
         servers_[i]->reload();
     }
-
-    if(broadcast)
-         Q_EMIT filterChangeEnded();
-
-#ifdef _UI_VMODELDATA_DEBUG
-    UiLog().dbg() << "<-- reload";
-#endif
 }
 
 void VModelData::slotFilterDefChanged()
 {
 #ifdef _UI_VMODELDATA_DEBUG
-    UiLog().dbg() << "VModelData::slotFilterDefChanged -->";
+    UI_FUNCTION_LOG
 #endif
 
     if(active_)
-        reload(true);
+        reload();
 }
 
 bool VModelData::isFilterComplete() const
 {
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
     {      
         return servers_[i]->filter()->isComplete();
     }
@@ -1323,7 +1373,7 @@ bool VModelData::isFilterComplete() const
 
 bool VModelData::isFilterNull() const
 {
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
     {
         return servers_[i]->filter()->isNull();
     }
@@ -1400,21 +1450,17 @@ void VTreeModelData::add(ServerHandler *server)
 
     VModelData::addToServers(d);
 
+    //??????
     if(active_)
-        reload(true);
+        reload();
 }
 
 void VTreeModelData::slotAttrFilterChanged()
 {
-    Q_EMIT filterChangeBegun();
-
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
     {
         servers_[i]->treeServer()->attrFilterChanged();
     }
-
-    Q_EMIT filterChangeEnded();
-
 }
 
 //==============================================================
@@ -1449,7 +1495,7 @@ void VTableModelData::add(ServerHandler *server)
     VModelData::addToServers(d);
 
     if(active_)
-        reload(false);
+        reload();
 }
 
 //Gives the position of this server in the full list of filtered nodes.
@@ -1460,7 +1506,7 @@ int VTableModelData::position(VTableServer* server)
 	if(server)
 	{
 		start=0;
-        for(unsigned int i=0; i < serverNum_; i++)
+        for(int i=0; i < serverNum_; i++)
 		{
             if(servers_[i] == server)
 			{
@@ -1485,7 +1531,7 @@ bool VTableModelData::position(VTableServer* server,int& start,int& count)
 		{          
             count=server->nodeNum();
 			start=0;
-            for(unsigned int i=0; i < serverNum_; i++)
+            for(int i=0; i < serverNum_; i++)
 			{
                 if(servers_[i] == server)
 				{
@@ -1506,7 +1552,7 @@ int VTableModelData::position(VTableServer* server,const VNode *node) const
 	if(server)
 	{
 		int totalRow=0;
-        for(unsigned int i=0; i < serverNum_; i++)
+        for(int i=0; i < serverNum_; i++)
 		{
             if(servers_[i] == server)
 			{				
@@ -1548,7 +1594,7 @@ VNode* VTableModelData::nodeAt(int totalRow)
 	if(totalRow < 0)
 		return NULL;
 
-    for(unsigned int i=0; i < serverNum_; i++)
+    for(int i=0; i < serverNum_; i++)
 	{
 		int pos=totalRow-cnt;
         if(pos < servers_[i]->nodeNum())
diff --git a/Viewer/src/VModelData.hpp b/Viewer/src/VModelData.hpp
index c91ed00..c80fa0f 100644
--- a/Viewer/src/VModelData.hpp
+++ b/Viewer/src/VModelData.hpp
@@ -25,6 +25,7 @@ class VServer;
 
 class AbstractNodeModel;
 class AttributeFilter;
+class ExpandState;
 class NodeFilter;
 class NodeFilterDef;
 class NodeQUery;
@@ -39,7 +40,6 @@ class VTableServer;
 class VTree;
 class VTreeNode;
 
-
 class VTreeChangeInfo
 {
 public:
@@ -109,10 +109,13 @@ public:
      void attrFilterChanged();
      void setForceShowNode(const VNode* node);
      void setForceShowAttribute(const VAttribute* node);
+     void setForceShow(const VItem* item);
      void clearForceShow(const VItem*);
      bool isFirstScan() const {return firstScan_;}
+     ExpandState* expandState() const {return expandState_;}
+     void setExpandState(ExpandState*);
 
-    //From ServerObserver
+     //From ServerObserver
 	 void notifyDefsChanged(ServerHandler* server, const std::vector<ecf::Aspect::Type>& a);
      void notifyServerDelete(ServerHandler*);
 	 void notifyBeginServerClear(ServerHandler* server);
@@ -152,6 +155,7 @@ private:
      bool firstScan_;
      int firstScanTryNo_;
      int maxFirstScanTry_;
+     ExpandState* expandState_;
 };
 
 class VTableServer : public VModelServer
@@ -212,7 +216,7 @@ public:
     void clear();
 	void reset(ServerFilter* servers);
 
-    void reload(bool broadcast);
+    void reload();
 
 	int count() const {return static_cast<int>(servers_.size());}
 	int  indexOfServer(void*) const;
@@ -240,8 +244,6 @@ Q_SIGNALS:
     //void filterChanged();
 	void filterDeleteBegin();
 	void filterDeleteEnd();
-    void filterChangeBegun();
-    void filterChangeEnded();
     void serverAddBegin(int);
 	void serverAddEnd();
     void serverRemoveBegin(VModelServer*,int);
diff --git a/Viewer/src/VNode.cpp b/Viewer/src/VNode.cpp
index 6388f48..1fc60e3 100644
--- a/Viewer/src/VNode.cpp
+++ b/Viewer/src/VNode.cpp
@@ -58,8 +58,8 @@ public:
     void get(VNode* node ,TriggerCollector* tc)
     {
         VServer* s=node->root();
-        int num=data_.size();
-        for(size_t i=0; i < num; i++)
+        std::size_t num=data_.size();
+        for(std::size_t i=0; i < num; i++)
         {
             VItem* triggered=s->nodeAt(data_[i]);
             tc->add(triggered,0,TriggerCollector::Normal);
@@ -218,9 +218,9 @@ void VNode::scanAttr()
 {  
     std::vector<VAttribute*> v;
     VAttributeType::scan(this,v);
-    int n=v.size();
+    std::size_t n=v.size();
     attr_.reserve(n);
-    for(size_t i=0; i < n; i++)
+    for(std::size_t i=0; i < n; i++)
         attr_.push_back(v[i]);
 }
 
@@ -256,11 +256,11 @@ VAttribute* VNode::attribute(int row,AttributeFilter *filter) const
     if(filter)
     {
         int n=0;
-        int cnt=attr_.size();
+        int cnt=static_cast<int>(attr_.size());
         if(row >= cnt)
             return 0;
 
-        for(size_t i=0; i < cnt; i++)
+        for(int i=0; i < cnt; i++)
         {
             if(filter->isSet(attr_[i]->type()) || filter->forceShowAttr() == attr_[i] )
             {
@@ -272,7 +272,7 @@ VAttribute* VNode::attribute(int row,AttributeFilter *filter) const
             }
         }
     }
-    else if(row < attr_.size())
+    else if(row < static_cast<int>(attr_.size()))
     {
         return attr_[row];
     }
@@ -284,14 +284,13 @@ VAttribute* VNode::attributeForType(int row,VAttributeType *t) const
 {
     assert(row>=0);
 
-    int n=0;
-    int cnt=attr_.size();
+    int cnt=static_cast<int>(attr_.size());
     if(row >= cnt)
         return 0;
 
     bool hasIt=false;
     int rowCnt=0;
-    for(size_t i=0; i < cnt; i++)
+    for(int i=0; i < cnt; i++)
     {
         if(attr_[i]->type() == t)
         {
@@ -316,8 +315,8 @@ int VNode::indexOfAttribute(const VAttribute* a, AttributeFilter *filter) const
     if(filter)
     {
         int n=0;
-        int cnt=attr_.size();
-        for(size_t i=0; i < cnt; i++)
+        int cnt=static_cast<int>(attr_.size());
+        for(int i=0; i < cnt; i++)
         {
             if(filter->isSet(attr_[i]->type())  || filter->forceShowAttr() == attr_[i]  )
             {
@@ -329,10 +328,9 @@ int VNode::indexOfAttribute(const VAttribute* a, AttributeFilter *filter) const
         }
     }
     else
-    {
-        int n=0;
-        int cnt=attr_.size();
-        for(size_t i=0; i < cnt; i++)
+    {        
+        int cnt=static_cast<int>(attr_.size());
+        for(int i=0; i < cnt; i++)
         {
             if(a == attr_[i])
                 return i;
@@ -353,9 +351,9 @@ VAttribute* VNode::findAttribute(VAttributeType *t,const std::string& name)
 {
     Q_ASSERT(t);
 
-    int cnt=attr_.size();
+    int cnt=static_cast<int>(attr_.size());
     bool hasType=false;
-    for(size_t i=0; i < cnt; i++)
+    for(int i=0; i < cnt; i++)
     {
         if(attr_[i]->type() == t)
         {
@@ -372,8 +370,8 @@ VAttribute* VNode::findAttribute(VAttributeType *t,const std::string& name)
 
 VAttribute* VNode::findAttribute(QStringList aData)
 {
-    int cnt=attr_.size();
-    for(size_t i=0; i < cnt; i++)
+    std::size_t cnt=attr_.size();
+    for(std::size_t i=0; i < cnt; i++)
     {
         if(attr_[i]->sameAs(aData))
             return attr_[i];
@@ -383,9 +381,9 @@ VAttribute* VNode::findAttribute(QStringList aData)
 
 void VNode::findAttributes(VAttributeType *t,std::vector<VAttribute*>& v)
 {
-    int cnt=attr_.size();
+    std::size_t cnt=attr_.size();
     bool hasType=false;
-    for(size_t i=0; i < cnt; i++)
+    for(std::size_t i=0; i < cnt; i++)
     {
         if(attr_[i]->type() == t)
         {
@@ -413,7 +411,7 @@ void VNode::removeChild(VNode* vn)
 
 VNode* VNode::childAt(int index) const
 {
-    assert(index>=0 && index < children_.size());
+    assert(index>=0 && index < static_cast<int>(children_.size()));
     return children_[index];
 }
 
@@ -775,10 +773,9 @@ VNode* VNode::ancestorAt(int idx,SortMode sortMode)
 		return this;
 
 	std::vector<VNode*> nodes=ancestors(sortMode);
-
-    if(nodes.size() > idx)
+    if(static_cast<int>(nodes.size()) > idx)
 	{
-		return nodes.at(idx);
+        return nodes[idx];
 	}
 
 	return NULL;
@@ -958,8 +955,8 @@ void VNode::triggers(TriggerCollector* tlc)
         //Limiters
         std::vector<VAttribute*> limiterVec;
         findAttributes(VAttributeType::find("limiter"),limiterVec);
-        int n=limiterVec.size();
-        for(size_t i=0; i < n; i++)
+        std::size_t n=limiterVec.size();
+        for(std::size_t i=0; i < n; i++)
         {
             VAttribute *a=limiterVec[i];
             assert(a);
@@ -969,7 +966,7 @@ void VNode::triggers(TriggerCollector* tlc)
                 if(VAttribute* n = findLimit(val, a->strName()))
                 {
 #ifdef _UI_VNODE_DEBUG
-                    UiLog().dbg() << "trigger limit: " << n->name();
+                    //UiLog().dbg() << "trigger limit: " << n->name();
 #endif                   
                     tlc->add(n,nullItem, TriggerCollector::Normal);
                 }
@@ -980,7 +977,7 @@ void VNode::triggers(TriggerCollector* tlc)
         std::vector<VAttribute*> dateVec;
         findAttributes(VAttributeType::find("date"),dateVec);
         n=dateVec.size();
-        for(size_t i=0; i < n; i++)
+        for(std::size_t i=0; i < n; i++)
         {
             tlc->add(dateVec[i],nullItem,TriggerCollector::Normal);
         }
@@ -989,7 +986,7 @@ void VNode::triggers(TriggerCollector* tlc)
         std::vector<VAttribute*> timeVec;
         findAttributes(VAttributeType::find("time"),timeVec);
         n=timeVec.size();
-        for(size_t i=0; i < n; i++)
+        for(std::size_t i=0; i < n; i++)
         {
             tlc->add(timeVec[i],nullItem,TriggerCollector::Normal);
         }
@@ -1024,6 +1021,13 @@ void VNode::triggersInChildren(VNode *n,VNode* p,TriggerCollector* tlc)
   }
 }
 
+void VNode::clearTriggerData()
+{
+    if(data_)
+        delete data_;
+    data_=0;
+}
+
 //These are called during the scan for triggered nodes
 void VNode::addTriggeredData(VItem* n)
 {
@@ -1110,8 +1114,8 @@ VAttribute* VNode::findLimit(const std::string& path, const std::string& name)
     //Find the matching limit in the node
     std::vector<VAttribute*> limit;
     n->findAttributes(VAttributeType::find("limit"),limit);
-    int limitNum=limit.size();
-    for(size_t i=0; i < limitNum; i++)
+    std::size_t limitNum=limit.size();
+    for(std::size_t i=0; i < limitNum; i++)
     {       
        if(limit[i]->strName() == name)
        {
@@ -1120,16 +1124,19 @@ VAttribute* VNode::findLimit(const std::string& path, const std::string& name)
     }
 
     //Find the matching limit in the ancestors
+    if (path.empty()) return nullItem;
     VNode* p=n->parent();
     Q_ASSERT(p);
     int chNum= p->numOfChildren();
     for(int i=0; i < chNum; i++)
     {
         VNode* ch=p->childAt(i);
-        if (ch->strName() == path.substr(0, ch->name().size()))
+        if(ch !=n && ch->strName() == path.substr(0, ch->name().size()))
         {
             std::string::size_type next = path.find('/');
-            return ch->findLimit(path.substr(next+1, path.size()), name);
+            if ( next != std::string::npos) {
+               return ch->findLimit(path.substr(next+1, path.size()), name);
+            }
         }
     }
 
@@ -1193,9 +1200,9 @@ int VServer::totalNumOfTopLevel(int idx) const
 {
 	assert(totalNumInChild_.size() == children_.size());
 
-	if(idx >=0 && idx < totalNumInChild_.size())
+    if(idx >=0 && idx < static_cast<int>(totalNumInChild_.size()))
 	{
-		return totalNumInChild_.at(idx);
+        return totalNumInChild_[idx];
 	}
 
 	return -1;
@@ -1263,7 +1270,7 @@ void VServer::clear()
 //Delete a particular node
 void VServer::deleteNode(VNode* node,bool hasNotifications)
 {
-	for(unsigned int i=0; i < node->numOfChildren(); i++)
+    for(int i=0; i < node->numOfChildren(); i++)
 	{
 		deleteNode(node->childAt(i),hasNotifications);
 	}
@@ -1544,7 +1551,7 @@ void VServer::scan(VNode *node,bool hasNotifications)
 
 VNode* VServer::nodeAt(int idx) const
 {
-	assert(idx>=0 && idx < nodes_.size());
+    assert(idx>=0 && idx < static_cast<int>(nodes_.size()));
 	return nodes_.at(idx);
 }
 
@@ -1554,7 +1561,14 @@ VNode* VServer::nodeAt(int idx) const
 
 void VServer::beginUpdate(VNode* node,const std::vector<ecf::Aspect::Type>& aspect,VNodeChange& change)
 {
-	//NOTE: when this function is called the real node (Node) has already been updated. However the
+#if 0
+    //If the number of nodes changed we need to rescan the whole server-tree
+    if(std::find(aspect.begin(),aspect.end(),ecf::Aspect::ADD_REMOVE_NODE) != aspect.end())
+    {
+        change.rescan_=true;
+    }
+#endif
+    //NOTE: when this function is called the real node (Node) has already been updated. However the
 	//views do not know about this change. So at this point (this is the begin step of the update)
 	//all VNode functions have to return the values valid before the update happened!!!!!!!
 	//The main goal of this function is to cleverly provide the views with some information about the nature of the update.
@@ -1580,55 +1594,29 @@ void VServer::beginUpdate(VNode* node,const std::vector<ecf::Aspect::Type>& aspe
 			node->check(server_->conf(),stateCh);
 		}
 	}
-#if 0
-	bool attrNumCh=(std::find(aspect.begin(),aspect.end(),ecf::Aspect::ADD_REMOVE_ATTR) != aspect.end());
-#endif
-    bool nodeNumCh=(std::find(aspect.begin(),aspect.end(),ecf::Aspect::ADD_REMOVE_NODE) != aspect.end());
 
-    bool attrNumCh=(std::find(aspect.begin(),aspect.end(),ecf::Aspect::ADD_REMOVE_ATTR) != aspect.end());
-    if(attrNumCh)
+    //-------------------------------------------------------------------------
+    // The trigger relations might be changed. We need to clear the mapped
+    // trigger relations globally if:
+    //    -a trigger expression changed (the aspect is EXPR_TRIGGER)
+    //    -a trigger expression was added or removed (the aspect is ADD_REMOVE_ATTR)
+    //--------------------------------------------------------------------------
+
+    for(std::vector<ecf::Aspect::Type>::const_iterator it=aspect.begin(); it != aspect.end(); ++it)
     {
-       node->rescanAttr();
+        if(*it == ecf::Aspect::ADD_REMOVE_ATTR)
+        {
+            //we need to rescan the attributes belong to the node
+            node->rescanAttr();
+            clearNodeTriggerData();
+            return;
+        }
+        else if (*it == ecf::Aspect::EXPR_TRIGGER)
+        {
+            clearNodeTriggerData();
+        }
     }
 
-	//----------------------------------------------------------------------
-	// The number of attributes changed but the number of nodes did not
-	//----------------------------------------------------------------------
-
-#if 0
-	if(attrNumCh && !nodeNumCh)
-	{
-        //The attributes were never used. None of the views have ever
-		//wanted to display/access these attributes so far, so we can
-		//just ignore this update!!
-		if(!node->isAttrNumInitialised())
-		{
-			change.ignore_=true;
-		}
-		//Otherwise we just register the number of attributes before and after the update
-		else
-		{
-			node->beginUpdateAttrNum();
-
-			//This it the current number of attributes stored in the real Node. This call will not change the
-			//the number of attributes (attrNum_ stored in the VNode!!!!)
-			change.attrNum_=node->currentAttrNum();
-
-			//this is the number of attributes before the update.
-			change.cachedAttrNum_=node->cachedAttrNum();
-		}
-
-		return;
-	}
-#endif
-	//---------------------------------------------------------------------------------
-	// The number of nodes changed.
-	//---------------------------------------------------------------------------------
-    if(nodeNumCh)
-	{
-		change.rescan_=true;
-	}
-
 	//In any other cases it is just a simple update (value or status changed)
 }
 
@@ -1639,20 +1627,6 @@ void VServer::beginUpdate(VNode* node,const std::vector<ecf::Aspect::Type>& aspe
 
 void VServer::endUpdate(VNode* node,const std::vector<ecf::Aspect::Type>& aspect,const VNodeChange& change)
 {
-#if 0
-    bool attrNumCh=(std::find(aspect.begin(),aspect.end(),ecf::Aspect::ADD_REMOVE_ATTR) != aspect.end());
-	bool nodeNumCh=(std::find(aspect.begin(),aspect.end(),ecf::Aspect::ADD_REMOVE_NODE) != aspect.end());
-
-	//--------------------------------------------------------------
-	// The number of attributes changed but the number of nodes did not
-	//-------------------------------------------------------------
-
-	if(attrNumCh && ! nodeNumCh)
-	{
-		//This call updates the number of attributes stored in the VNode
-		node->endUpdateAttrNum();
-	}
-#endif
 }
 
 void VServer::beginUpdate(const std::vector<ecf::Aspect::Type>& aspect)
@@ -1788,6 +1762,7 @@ QString VServer::toolTip()
 	txt+=" <b>Port</b>: " + QString::fromStdString(server_->port()) + "<br>";
 
 	ConnectState* st=server_->connectState();
+    QColor colErr(255,95,95);
 
 	if(server_->activity() == ServerHandler::LoadActivity)
 	{
@@ -1803,8 +1778,7 @@ QString VServer::toolTip()
 			txt+="<b>Total number of nodes</b>: " +  QString::number(totalNum_);
 		}
 		else if(st->state() == ConnectState::Lost)
-		{
-			QColor colErr(255,0,0);
+		{			
 			txt+="<b><font color=" + colErr.name() +">Failed to connect to server!</b><br>";
 			txt+="<b>Last connection</b>: " + VFileInfo::formatDateAgo(st->lastConnectTime()) + "<br>";
 			txt+="<b>Last failed attempt</b>: " + VFileInfo::formatDateAgo(st->lastLostTime()) + "<br>";
@@ -1812,11 +1786,19 @@ QString VServer::toolTip()
 				txt+="<b>Error message</b>:<br>" + QString::fromStdString(st->shortErrorMessage());
 		}
 		else if(st->state() == ConnectState::Disconnected)
-		{
-			QColor colErr(255,0,0);
+		{			
 			txt+="<b><font color=" + colErr.name() +">Server is disconnected!</b><br>";
 			txt+="<b>Disconnected</b>: " + VFileInfo::formatDateAgo(st->lastDisconnectTime()) + "<br>";
 		}
 	}
 	return txt;
 }
+
+void VServer::clearNodeTriggerData()
+{
+    triggeredScanned_=false;
+    std::size_t num=nodes_.size();
+    for(std::size_t i=0; i < num; i++)
+        nodes_[i]->clearTriggerData();
+}
+
diff --git a/Viewer/src/VNode.hpp b/Viewer/src/VNode.hpp
index 23bd487..d81db54 100644
--- a/Viewer/src/VNode.hpp
+++ b/Viewer/src/VNode.hpp
@@ -105,7 +105,7 @@ public:
 	enum SortMode {ParentToChildSort,ChildToParentSort};
 
     VServer *root() const;
-    virtual ServerHandler* server() const;
+    ServerHandler* server() const;
     virtual VNode* suite() const;
     node_ptr node() const {return node_;}  
     VNode* isNode() const {return const_cast<VNode*>(this);}
@@ -190,6 +190,7 @@ public:
 
     void triggers(TriggerCollector*);   
     void triggered(TriggerCollector* tlc,TriggeredScanner* scanner=0);
+    void clearTriggerData();
     void addTriggeredData(VItem* n);
     void addTriggeredData(VItem* a,VItem* n);
 
@@ -313,12 +314,14 @@ public:
 
 	void why(std::vector<std::string>& theReasonWhy) const;
 
+    bool triggeredScanned() const {return triggeredScanned_;}
+
 protected:
 	//Clear contents and rebuild the whole tree.
 	void beginScan(VServerChange&);
 	void endScan();
-    bool triggeredScanned() const {return triggeredScanned_;}
     void setTriggeredScanned(bool b) {triggeredScanned_=b;}
+    void clearNodeTriggerData();
 
 private:
 	void clear();
diff --git a/Viewer/src/VNodeList.cpp b/Viewer/src/VNodeList.cpp
index 80aac19..a4f4db4 100644
--- a/Viewer/src/VNodeList.cpp
+++ b/Viewer/src/VNodeList.cpp
@@ -78,7 +78,7 @@ VNodeList::~VNodeList()
 
 VNodeListItem* VNodeList::itemAt(int i)
 {
-	if(i >= 0 && i < data_.size())
+    if(i >= 0 && i < static_cast<int>(data_.size()))
 		return data_.at(i);
 
 	return NULL;
diff --git a/Viewer/src/VProperty.cpp b/Viewer/src/VProperty.cpp
index 4cf1c5d..c346cfb 100644
--- a/Viewer/src/VProperty.cpp
+++ b/Viewer/src/VProperty.cpp
@@ -172,36 +172,40 @@ void VProperty::setValue(QVariant val)
     	dispatchChange();
 }
 
-std::string VProperty::valueAsString() const
+QString VProperty::valueAsString() const
 {
-	QString s;
+    QString s;
 
-	switch(type_)
-	{
-	case StringType:
-		s=value().toString();
-		break;
-	case IntType:
-		s=QString::number(value_.toInt());
-		break;
-	case BoolType:
-		s=(value().toBool() == true)?"true":"false";
-		break;
-	case ColourType:
-		s=VProperty::toString(value().value<QColor>());
-		break;
-	case FontType:
-		s=VProperty::toString(value().value<QFont>());
-		break;
-	case SoundType:
-		s=value().toString();
-		break;
-	default:
-		break;
+    switch(type_)
+    {
+    case StringType:
+        s=value().toString();
+        break;
+    case IntType:
+        s=QString::number(value_.toInt());
+        break;
+    case BoolType:
+        s=(value().toBool() == true)?"true":"false";
+        break;
+    case ColourType:
+        s=VProperty::toString(value().value<QColor>());
+        break;
+    case FontType:
+        s=VProperty::toString(value().value<QFont>());
+        break;
+    case SoundType:
+        s=value().toString();
+        break;
+    default:
+        break;
+    }
 
-	}
+    return s;
+}
 
-	return s.toStdString();
+std::string VProperty::valueAsStdString() const
+{	
+    return valueAsString().toStdString();
 }
 
 void VProperty::setParam(QString name,QString value)
@@ -223,15 +227,37 @@ void VProperty::setParam(QString name,QString value)
     params_[name]=value;
 }
 
-QString VProperty::param(QString name)
+QString VProperty::param(QString name) const
 {
 	QMap<QString,QString>::const_iterator it=params_.find(name);
 	if(it != params_.end())
-			return it.value();
+        return it.value();
 
 	return QString();
 }
 
+QString VProperty::valueLabel() const
+{
+    QString v=valueAsString();
+    QString vals=param("values");
+    if(!vals.isEmpty())
+    {
+        QString vl=param("values_label");
+        if(!vl.isEmpty())
+        {
+            QStringList valLst=vals.split("/");
+            QStringList labelLst=vl.split("/");
+            if(valLst.count() == labelLst.count())
+            {
+                int idx=valLst.indexOf(v);
+                if(idx >=0)
+                    return labelLst[idx];
+            }
+        }
+    }
+    return v;
+}
+
 void VProperty::adjustAfterLoad()
 {
 	QString vals=param("values");
@@ -385,7 +411,8 @@ void VProperty::setUseMaster(bool b)
 
 		if(useMaster_)
 		{
-			value_=master_->value_;
+            value_=master_->value_;
+            dispatchChange();
 		}
 	}
 }
diff --git a/Viewer/src/VProperty.hpp b/Viewer/src/VProperty.hpp
index 0bc7656..d67f805 100644
--- a/Viewer/src/VProperty.hpp
+++ b/Viewer/src/VProperty.hpp
@@ -59,10 +59,12 @@ public:
     const std::string& strName() const {return strName_;}
     QVariant defaultValue() const {return defaultValue_;}
     QVariant value() const;
-    std::string valueAsString() const;
+    QString valueLabel() const;
+    QString valueAsString() const;
+    std::string valueAsStdString() const;
     Type type() const {return type_;}
     GuiType guiType() const {return guiType_;}
-    QString param(QString name);
+    QString param(QString name) const;
     QColor paramToColour(QString name) {return toColour(param(name).toStdString()) ;}
 
     void setDefaultValue(const std::string&);
diff --git a/Viewer/src/VRepeatAttr.cpp b/Viewer/src/VRepeatAttr.cpp
index fdf9ec8..2b03c32 100644
--- a/Viewer/src/VRepeatAttr.cpp
+++ b/Viewer/src/VRepeatAttr.cpp
@@ -101,7 +101,7 @@ long ecf_repeat_date_to_julian(long ddate)
 
 VRepeatAttrType::VRepeatAttrType() : VAttributeType("repeat")
 {
-    dataCount_=7;
+    dataCount_=8;
     searchKeyToData_["repeat_name"]=NameIndex;
     searchKeyToData_["repeat_value"]=ValueIndex;
     searchKeyToData_["name"]=NameIndex;
@@ -137,24 +137,31 @@ QString VRepeatAttrType::definition(QStringList d) const
     QString t="repeat";
     if(d.count() == dataCount_)
     {
-        t+=" " + d[SubtypeIndex];
+        QString subType=d[SubtypeIndex];
 
-        if(d[SubtypeIndex] != "day")
+        t+=" " + subType;
+
+        if(subType == "integer" || subType == "date")
         {
             t+=" " + d[NameIndex];
             t+=" " + d[StartIndex];
             t+=" " + d[EndIndex];
             t+=" " + d[StepIndex];
         }
+        else if(subType == "string" || subType == "enumerated")
+        {
+            t+=" " + d[NameIndex];
+            t+=" " + d[AllValuesIndex];
+        }
         else
         {
             t+=" " + d[StepIndex];
-        }
+        }       
     }
     return t;
 }
 
-void VRepeatAttrType::encode(const Repeat& r,QStringList& data,const std::string& type) const
+void VRepeatAttrType::encode(const Repeat& r,QStringList& data,const std::string& type,QString allValues) const
 {
     //We try to avoid creating a VRepeat object everytime we are here
     //std::string type=VRepeat::type(r);
@@ -164,8 +171,8 @@ void VRepeatAttrType::encode(const Repeat& r,QStringList& data,const std::string
          QString::fromStdString(r.valueAsString()) <<
          QString::fromStdString(r.value_as_string(r.start())) <<
          QString::fromStdString(r.value_as_string(r.end())) <<
-         QString::number(r.step());
-
+         QString::number(r.step()) <<
+         allValues;
 }
 
 //=====================================================
@@ -202,7 +209,7 @@ QStringList VRepeatAttr::data(bool /*firstLine*/) const
     if(parent_->node_)
     {
         const Repeat& r=parent_->node_->repeat();
-        atype->encode(r,s,subType());
+        atype->encode(r,s,subType(),allValues());
     }
     return s;
 }
@@ -246,6 +253,11 @@ void VRepeatAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
     }
 }
 
+QString VRepeatAttr::allValues() const
+{
+   return QString();
+}
+
 //=====================================================
 //
 // VRepeatDateAttr
@@ -257,8 +269,20 @@ int VRepeatDateAttr::endIndex() const
     if(node_ptr node=parent_->node())
     {
         const Repeat& r=node->repeat();
-        return (ecf_repeat_date_to_julian(r.end()) -
-            ecf_repeat_date_to_julian(r.start())) / r.step() + 1;
+        if(r.step() >0)
+        {
+            long jStart=ecf_repeat_date_to_julian(r.start());
+            long jEnd=ecf_repeat_date_to_julian(r.end());
+
+            int index=(jEnd-jStart)/r.step();
+            long val=jStart + index*r.step();
+            while(val > jEnd && index >=1)
+            {
+                index--;
+                val=jStart + index*r.step();
+            }
+            return index;
+        }
     }
     return 0;
 }
@@ -301,7 +325,7 @@ int VRepeatIntAttr::endIndex() const
         const Repeat& r=node->repeat();
         if(r.step() >0)
         {
-            int index=(r.end() - r.start()) / r.step() + 1;
+            int index=(r.end() - r.start()) / r.step();
             int val=r.start() + index*r.step();
             while(val > r.end() && index >=1)
             {
@@ -389,6 +413,36 @@ int VRepeatEnumAttr::currentIndex() const
     return 0;
 }
 
+QString VRepeatEnumAttr::allValues() const
+{
+    QString vals;
+
+    if(node_ptr node=parent_->node())
+    {
+        const Repeat& r=node->repeat();
+        int start=r.start();
+        int end=r.end();
+
+        if(end <= start)
+        {
+            return QString();
+        }
+
+        if(end-start >1)
+        {
+            for(int i=start; i <= end; i++)
+            {
+                if(!vals.isEmpty()) vals+=" ";
+                vals+="\"" + QString::fromStdString(r.value_as_string(i)) + "\"";
+            }
+            return vals;
+        }
+
+    }
+    return vals;
+}
+
+
 //=====================================================
 //
 // VRepeatStringAttr
@@ -425,4 +479,32 @@ int VRepeatStringAttr::currentIndex() const
     return 0;
 }
 
+QString VRepeatStringAttr::allValues() const
+{
+    QString vals;
+
+    if(node_ptr node=parent_->node())
+    {
+        const Repeat& r=node->repeat();
+        int start=r.start();
+        int end=r.end();
+
+        if(end <= start)
+        {
+            return QString();
+        }
+
+        if(end-start >1)
+        {
+            for(int i=start; i <= end; i++)
+            {
+                if(!vals.isEmpty()) vals+=" ";
+                vals+="\"" + QString::fromStdString(r.value_as_string(i)) + "\"";
+            }
+            return vals;
+        }
+
+    }
+    return vals;
+}
 
diff --git a/Viewer/src/VRepeatAttr.hpp b/Viewer/src/VRepeatAttr.hpp
index bc4a90f..4127e4c 100644
--- a/Viewer/src/VRepeatAttr.hpp
+++ b/Viewer/src/VRepeatAttr.hpp
@@ -27,10 +27,10 @@ public:
     explicit VRepeatAttrType();
     QString toolTip(QStringList d) const;
     QString definition(QStringList d) const;
-    void encode(const Repeat&,QStringList&,const std::string&) const;
+    void encode(const Repeat&,QStringList&,const std::string&,QString) const;
 
 private:
-    enum DataIndex {TypeIndex=0,SubtypeIndex=1,NameIndex=2,ValueIndex=3,StartIndex=4,EndIndex=5,StepIndex=6};
+    enum DataIndex {TypeIndex=0,SubtypeIndex=1,NameIndex=2,ValueIndex=3,StartIndex=4,EndIndex=5,StepIndex=6,AllValuesIndex=7};
 };
 
 class VRepeatAttr : public VAttribute
@@ -42,13 +42,16 @@ public:
     virtual int endIndex() const=0;
     virtual int currentIndex() const=0;
     int step() const;
-    virtual std::string value(int index) const=0;    
+    virtual std::string value(int index) const=0;
 
     VAttributeType* type() const;
     QStringList data(bool firstLine) const;
     std::string strName() const;
 
     static void scan(VNode* vnode,std::vector<VAttribute*>& vec);
+
+    virtual QString allValues() const;
+
 };
 
 class VRepeatDateAttr : public VRepeatAttr
@@ -98,6 +101,7 @@ public:
     int currentIndex() const;
     std::string value(int index) const;
     const std::string& subType() const {return subType_;}
+    QString allValues() const;
 
 protected:
     static std::string subType_;
@@ -111,6 +115,7 @@ public:
     int currentIndex() const;
     std::string value(int index) const;
     const std::string& subType() const {return subType_;}
+    QString allValues() const;
 
 protected:
     static std::string subType_;
diff --git a/Viewer/src/VServerSettings.cpp b/Viewer/src/VServerSettings.cpp
index 1eff21a..8efe7f2 100644
--- a/Viewer/src/VServerSettings.cpp
+++ b/Viewer/src/VServerSettings.cpp
@@ -153,6 +153,17 @@ std::string VServerSettings::notificationId(Param par)
 	return std::string();
 }
 
+VServerSettings::Param VServerSettings::notificationParam(const std::string& id)
+{
+    for(std::map<Param,std::string>::const_iterator it=notifyIds_.begin(); it != notifyIds_.end(); it++)
+    {
+        if(it->second == id)
+            return it->first;
+    }
+
+    return UnknownParam;
+}
+
 bool VServerSettings::notificationsEnabled() const
 {
 	for(std::map<Param,std::string>::const_iterator it=notifyIds_.begin(); it != notifyIds_.end(); it++)
diff --git a/Viewer/src/VServerSettings.hpp b/Viewer/src/VServerSettings.hpp
index 511f192..c69705e 100644
--- a/Viewer/src/VServerSettings.hpp
+++ b/Viewer/src/VServerSettings.hpp
@@ -29,13 +29,14 @@ public:
 			   NotifyRestartedEnabled, NotifyRestartedPopup, NotifyRestartedSound,
 			   NotifyLateEnabled, NotifyLatePopup, NotifyLateSound,
 			   NotifyZombieEnabled, NotifyZombiePopup, NotifyZombieSound,
-			   NotifyAliasEnabled, NotifyAliasPopup, NotifyAliasSound};
+               NotifyAliasEnabled, NotifyAliasPopup, NotifyAliasSound, UnknownParam};
 
 	int intValue(Param par) const;
 	bool boolValue(Param par) const;
 	VProperty* guiProp() const {return guiProp_;}
 	bool notificationsEnabled() const;
-	static std::string notificationId(Param);
+    static std::string notificationId(Param);
+    static Param notificationParam(const std::string& id);
 
 	void saveSettings();
 
diff --git a/Viewer/src/VTaskObserver.hpp b/Viewer/src/VTaskObserver.hpp
index 04d024a..b8c25c5 100644
--- a/Viewer/src/VTaskObserver.hpp
+++ b/Viewer/src/VTaskObserver.hpp
@@ -15,7 +15,7 @@
 class VTaskObserver
 {
 public:
-	virtual ~VTaskObserver() {};
+    virtual ~VTaskObserver() {}
 	virtual void taskChanged(VTask_ptr)=0;
 };
 
diff --git a/Viewer/src/VTimeAttr.cpp b/Viewer/src/VTimeAttr.cpp
index 4fe1eac..e2d06d8 100644
--- a/Viewer/src/VTimeAttr.cpp
+++ b/Viewer/src/VTimeAttr.cpp
@@ -101,19 +101,19 @@ QStringList VTimeAttr::data(bool /*firstLine*/) const
         if(dataType_ == TimeData)
         {
             const std::vector<ecf::TimeAttr>& v=parent_->node_->timeVec();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 atype->encode(v[index_],s);
         }
         else if(dataType_ == TodayData)
         {
             const std::vector<ecf::TodayAttr>& v=parent_->node_->todayVec();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 atype->encode(v[index_],s);
         }
         else if(dataType_ == CronData)
         {
             const std::vector<ecf::CronAttr>& v=parent_->node_->crons();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 atype->encode(v[index_],s);
         }
     }
@@ -127,19 +127,19 @@ std::string VTimeAttr::strName() const
         if(dataType_ == TimeData)
         {
             const std::vector<ecf::TimeAttr>& v=parent_->node_->timeVec();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 return v[index_].name();
         }
         else if(dataType_ == TodayData)
         {
             const std::vector<ecf::TodayAttr>& v=parent_->node_->todayVec();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 return v[index_].name();
         }
         else if(dataType_ == CronData)
         {
             const std::vector<ecf::CronAttr>& v=parent_->node_->crons();
-            if(index_ < v.size())
+            if(index_ < static_cast<int>(v.size()))
                 return v[index_].name();
         }
     }
@@ -154,20 +154,20 @@ void VTimeAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
         const std::vector<ecf::TodayAttr>& tdV=vnode->node_->todayVec();
         const std::vector<ecf::CronAttr>& cV=vnode->node_->crons();
 
-        int n=tV.size();
-        for(size_t i=0; i < n; i++)
+        int n=static_cast<int>(tV.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VTimeAttr(vnode,tV[i],i));
         }
 
-        n=tdV.size();
-        for(size_t i=0; i < n; i++)
+        n=static_cast<int>(tdV.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VTimeAttr(vnode,tdV[i],i));
         }
 
-        n=cV.size();
-        for(size_t i=0; i < n; i++)
+        n=static_cast<int>(cV.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VTimeAttr(vnode,cV[i],i));
         }
diff --git a/Viewer/src/VTree.cpp b/Viewer/src/VTree.cpp
index 9e153c1..639576c 100644
--- a/Viewer/src/VTree.cpp
+++ b/Viewer/src/VTree.cpp
@@ -10,6 +10,7 @@
 #include "VTree.hpp"
 
 #include "ServerHandler.hpp"
+#include "UIDebug.hpp"
 #include "UserMessage.hpp"
 #include "VAttributeType.hpp"
 #include "VNode.hpp"
@@ -194,7 +195,7 @@ VNode* VTree::vnodeAt(int index) const
 
 VTreeNode* VTree::find(const VNode* vn) const
 {
-    Q_ASSERT(vn->index()  < nodeVec_.size());
+    UI_ASSERT(vn->index()  < static_cast<int>(nodeVec_.size()),"vn index=" << vn->index() << " size=" << nodeVec_.size());
     return nodeVec_[vn->index()];
 }
 
@@ -226,7 +227,7 @@ int VTree::totalNumOfTopLevel(VTreeNode* n) const
 
 int VTree::totalNumOfTopLevel(int idx) const
 {
-    assert(idx >=0 && idx < children_.size());
+    assert(idx >=0 && idx < static_cast<int>(children_.size()));
 
     return children_[idx]->totalNumOfChildren();
 }
@@ -242,7 +243,7 @@ int VTree::indexOfTopLevelToInsert(VNode* suite) const
     int suiteIdx=s->indexOfChild(suite);
     assert(suiteIdx >=0);
 
-    for(unsigned int i=0; i < numOfChildren();i++)
+    for(int i=0; i < numOfChildren();i++)
     {
         int idx=s->indexOfChild(children_[i]->vnode_);
         assert(idx >=0);
@@ -295,7 +296,7 @@ VTreeNode* VTree::makeBranch(const std::vector<VNode*>& filter,VTreeNode* parent
 
     assert(filter[vnode->index()] != NULL);
 
-    for(unsigned int i=0; i < vnode->numOfChildren();i++)
+    for(int i=0; i < vnode->numOfChildren();i++)
     {
         build(branch,vnode->childAt(i),filter);
     }
@@ -308,7 +309,7 @@ void VTree::replaceWithBranch(VTreeNode* node,VTreeNode* branch)
     assert(node->vnode() == branch->vnode());
     assert(node->numOfChildren() == 0);
 
-    for(unsigned int i=0; i < branch->numOfChildren();i++)
+    for(int i=0; i < branch->numOfChildren();i++)
     {
         branch->childAt(i)->parent_=node;
         node->addChild(branch->childAt(i));
@@ -335,7 +336,7 @@ VTreeNode* VTree::makeTopLevelBranch(const std::vector<VNode*>& filter,VNode* su
     assert(suite->isSuite());
     VTreeSuiteNode *branch=new VTreeSuiteNode(suite,0);
 
-    for(unsigned int i=0; i < suite->numOfChildren();i++)
+    for(int i=0; i < suite->numOfChildren();i++)
     {
         build(branch,suite->childAt(i),filter);
     }
@@ -396,7 +397,7 @@ void VTree::build(const std::vector<VNode*>& filter)
     assert(filter.size() == nodeVec_.size());
 
     //int prevTotalNum=0;
-    for(unsigned int i=0; i < s->numOfChildren();i++)
+    for(int i=0; i < s->numOfChildren();i++)
     {
         build(this,s->childAt(i),filter);
 #if 0
@@ -408,7 +409,7 @@ void VTree::build(const std::vector<VNode*>& filter)
 #endif
     }
 
-    for(unsigned int i=0; i < numOfChildren();i++)
+    for(int i=0; i < numOfChildren();i++)
     {
         children_[i]->countChildren();
         totalNum_+=children_[i]->totalNumOfChildren()+1;
@@ -434,7 +435,7 @@ bool VTree::build(VTreeNode* parent,VNode* node,const std::vector<VNode*>& filte
 
          nodeVec_[node->index()]=n;
 
-         for(unsigned int j=0; j < node->numOfChildren();j++)
+         for(int j=0; j < node->numOfChildren();j++)
          {
              build(n,node->childAt(j),filter);
          }
@@ -459,7 +460,7 @@ void VTree::build()
     std::fill(nodeVec_.begin(), nodeVec_.end(), nptr);
 
     //int prevTotalNum=0;
-    for(unsigned int i=0; i < s->numOfChildren();i++)
+    for(int i=0; i < s->numOfChildren();i++)
     {     
         build(this,s->childAt(i));
         children_[i]->countChildren();
@@ -485,7 +486,7 @@ void VTree::build(VTreeNode* parent,VNode* vnode)
     if(vnode->numOfChildren() > 0)
         n->children_.reserve(vnode->numOfChildren());
 
-    for(unsigned int j=0; j < vnode->numOfChildren();j++)
+    for(int j=0; j < vnode->numOfChildren();j++)
     {
         build(n,vnode->childAt(j));
     }
diff --git a/Viewer/src/VTree.hpp b/Viewer/src/VTree.hpp
index 39b4937..53a2dd3 100644
--- a/Viewer/src/VTree.hpp
+++ b/Viewer/src/VTree.hpp
@@ -34,7 +34,7 @@ public:
     VTreeNode* findChild(const std::string&) const;
     int indexOfChild(const VTreeNode* vn) const;
     int indexInParent() const;
-    VTreeNode* childAt(int i) {return children_[i];}
+    VTreeNode* childAt(int i) const {return children_[i];}
     VTreeNode* parent() const {return parent_;}
     virtual VTree* root() const;
     virtual VTreeServer* server() const;
diff --git a/Viewer/src/VUserVarAttr.cpp b/Viewer/src/VUserVarAttr.cpp
index d7f2ca1..c482cb8 100644
--- a/Viewer/src/VUserVarAttr.cpp
+++ b/Viewer/src/VUserVarAttr.cpp
@@ -30,7 +30,15 @@ VUserVarAttrType::VUserVarAttrType() : VAttributeType("var")
 
 QString VUserVarAttrType::toolTip(QStringList d) const
 {
-   return QString();
+    QString t="<b>Type:</b> User variable<br>";
+    if(d.count() == dataCount_)
+    {
+        t+="<b>Name:</b> " + d[NameIndex] + "<br>";
+        QString s=d[ValueIndex];
+        if(s.size() > 150) s=s.left(150) + "...";
+        t+="<b>Value:</b> " + s;
+    }
+    return t;
 }
 
 void VUserVarAttrType::encode(const Variable& v,QStringList& data) const
@@ -111,8 +119,8 @@ void VUserVarAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
         if(vnode->node_)
         {
             const std::vector<Variable>& v=vnode->node_->variables();
-            int n=v.size();
-            for(size_t i=0; i < n; i++)
+            int n=static_cast<int>(v.size());
+            for(int i=0; i < n; i++)
             {
                 vec.push_back(new VUserVarAttr(vnode,v[i],i));
             }
@@ -123,8 +131,8 @@ void VUserVarAttr::scan(VNode* vnode,std::vector<VAttribute*>& vec)
     {
         std::vector<Variable> v;
         vnode->variables(v);
-        int n=v.size();
-        for(size_t i=0; i < n; i++)
+        int n=static_cast<int>(v.size());
+        for(int i=0; i < n; i++)
         {
             vec.push_back(new VUserVarAttr(vnode,v[i],i));
         }
diff --git a/Viewer/src/TriggerEditor.cpp b/Viewer/src/VariableEditor.cpp
similarity index 51%
copy from Viewer/src/TriggerEditor.cpp
copy to Viewer/src/VariableEditor.cpp
index d3ba6bc..2b98f53 100644
--- a/Viewer/src/TriggerEditor.cpp
+++ b/Viewer/src/VariableEditor.cpp
@@ -8,114 +8,116 @@
 //
 //============================================================================
 
-#include "TriggerEditor.hpp"
+#include "VariableEditor.hpp"
 
 #include <QSettings>
 
 #include "AttributeEditorFactory.hpp"
-#include "Highlighter.hpp"
 #include "VAttribute.hpp"
 #include "VAttributeType.hpp"
+#include "VGenVarAttr.hpp"
 #include "ServerHandler.hpp"
 #include "SessionHandler.hpp"
 
-TriggerEditorWidget::TriggerEditorWidget(QWidget* parent) : QWidget(parent)
+VariableEditorWidget::VariableEditorWidget(QWidget* parent) : QWidget(parent)
 {
     setupUi(this);
 
-#if 0
     QLayoutItem *item;
     item=grid_->itemAtPosition(1,0);
     Q_ASSERT(item);
     item->setAlignment(Qt::AlignLeft|Qt::AlignTop);
-#endif
-
-    Highlighter *h=new Highlighter(te_->document(),"trigger");
-    te_->setShowLineNumbers(false);
 }
 
-TriggerEditor::TriggerEditor(VInfo_ptr info,QWidget* parent) : AttributeEditor(info,"trigger",parent)
+VariableEditor::VariableEditor(VInfo_ptr info,QWidget* parent) :
+    AttributeEditor(info,"variable",parent),
+    readOnly_(false)
 {
-    w_=new TriggerEditorWidget(this);
+    w_=new VariableEditorWidget(this);
     addForm(w_);
 
     VAttribute* a=info_->attribute();
 
     Q_ASSERT(a);
     Q_ASSERT(a->type());
-    Q_ASSERT(a->type()->name() == "trigger");
-
-    //Data is built dynamically so we store it
-    QStringList data=a->data();
+    Q_ASSERT(a->type()->name() == "var" || a->type()->name() == "genvar");
 
-    if(data.count() != 3)
+    if(a->data().count() < 2)
         return;
 
-    QString txt=data[2];
+    QString name=a->data().at(1);
+    QString val;
+    if(a->data().count() > 2)
+        val=a->data().at(2);
 
-    oriText_=txt;
-    w_->te_->setPlainText(txt);
+    oriVal_=val;
 
-    QString typeInHeader;
-    if(data[1]=="0")
+    w_->nameLabel_->setText(name);
+    w_->valueTe_->setPlainText(val);
+    w_->valueTe_->setFocus();
+
+    QString typeLabel=(a->type()->name() == "var")?"User variable":"Generated variable";
+    readOnly_=VGenVarAttr::isReadOnly(name.toStdString());
+    if(readOnly_)
     {
-        typeInCmd_="trigger";
-        typeInHeader="Trigger";
+        w_->valueTe_->setReadOnly(true);
+        typeLabel+=" (read only)";
     }
     else
     {
-        typeInCmd_="complete";
-        typeInHeader="Complete";
+        connect(w_->valueTe_,SIGNAL(textChanged()),
+            this,SLOT(slotValueChanged()));
     }
-    typeInHeader+=" expression";
 
-    header_->setInfo(QString::fromStdString(info_->path()),typeInHeader);
-
-    connect(w_->te_,SIGNAL(textChanged()),
-            this,SLOT(slotValueChanged()));
+    header_->setInfo(QString::fromStdString(info_->path()),typeLabel);
 
     checkButtonStatus();
 
     readSettings();
 }
 
-TriggerEditor::~TriggerEditor()
+VariableEditor::~VariableEditor()
 {
     writeSettings();
 }
 
-void TriggerEditor::apply()
+void VariableEditor::apply()
 {
-    if(typeInCmd_.isEmpty())
-        return;
-
-    std::string txt=w_->te_->toPlainText().toStdString();
-    std::vector<std::string> cmd;
-    VAttribute::buildAlterCommand(cmd,"change",typeInCmd_.toStdString(),txt);
-    ServerHandler::command(info_,cmd);
+    if(!readOnly_)
+    {
+        std::string val=w_->valueTe_->toPlainText().toStdString();
+        std::string name=w_->nameLabel_->text().toStdString();
+
+        if(val != oriVal_.toStdString())
+        {
+            std::vector<std::string> cmd;
+            VAttribute::buildAlterCommand(cmd,"change","variable",name,val);
+            ServerHandler::command(info_,cmd);
+        }
+    }
 }
 
-void TriggerEditor::resetValue()
+void VariableEditor::resetValue()
 {
-    w_->te_->setPlainText(oriText_);
+    w_->valueTe_->setPlainText(oriVal_);
     checkButtonStatus();
 }
 
-void TriggerEditor::slotValueChanged()
+void VariableEditor::slotValueChanged()
 {
     checkButtonStatus();
 }
 
-bool TriggerEditor::isValueChanged()
+bool VariableEditor::isValueChanged()
 {
-    return (oriText_ != w_->te_->toPlainText());
+    return (oriVal_ != w_->valueTe_->toPlainText());
 }
 
-void TriggerEditor::writeSettings()
+void VariableEditor::writeSettings()
 {
     SessionItem* cs=SessionHandler::instance()->current();
     Q_ASSERT(cs);
-    QSettings settings(QString::fromStdString(cs->qtSettingsFile("TriggerEditor")),
+    QSettings settings(QString::fromStdString(cs->qtSettingsFile("VariableEditor")),
                        QSettings::NativeFormat);
 
     //We have to clear it so that should not remember all the previous values
@@ -123,15 +125,14 @@ void TriggerEditor::writeSettings()
 
     settings.beginGroup("main");
     settings.setValue("size",size());
-    settings.setValue("fontSize",w_->te_->font().pointSize());
     settings.endGroup();
 }
 
-void TriggerEditor::readSettings()
+void VariableEditor::readSettings()
 {
     SessionItem* cs=SessionHandler::instance()->current();
     Q_ASSERT(cs);
-    QSettings settings(QString::fromStdString(cs->qtSettingsFile("TriggerEditor")),
+    QSettings settings(QString::fromStdString(cs->qtSettingsFile("VariableEditor")),
                        QSettings::NativeFormat);
 
     settings.beginGroup("main");
@@ -144,18 +145,8 @@ void TriggerEditor::readSettings()
         resize(QSize(310,200));
     }
 
-    if(settings.contains("fontSize"))
-    {
-        QFont f=w_->te_->font();
-        int fSize=settings.value("fontSize").toInt();
-        if(fSize > 0 && fSize < 100)
-            f.setPointSize(fSize);
-
-        w_->te_->setFont(f);
-    }
-
     settings.endGroup();
 }
 
-static AttributeEditorMaker<TriggerEditor> makerStr("trigger");
-
+static AttributeEditorMaker<VariableEditor> makerStrVar("var");
+static AttributeEditorMaker<VariableEditor> makerStrGenvar("genvar");
diff --git a/Viewer/src/VariableEditor.hpp b/Viewer/src/VariableEditor.hpp
new file mode 100644
index 0000000..6214913
--- /dev/null
+++ b/Viewer/src/VariableEditor.hpp
@@ -0,0 +1,50 @@
+//============================================================================
+// Copyright 2009-2017 ECMWF.
+// This software is licensed under the terms of the Apache Licence version 2.0
+// which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+// In applying this licence, ECMWF does not 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 VARIABLEEDITOR_HPP
+#define VARIABLEEDITOR_HPP
+
+#include "ui_VariableEditorWidget.h"
+
+#include "AttributeEditor.hpp"
+#include "VInfo.hpp"
+
+class VariableEditor;
+
+class VariableEditorWidget :  public QWidget, protected Ui::VariableEditorWidget
+{
+friend class VariableEditor;
+public:
+    VariableEditorWidget(QWidget *parent=0);
+};
+
+class VariableEditor : public AttributeEditor
+{
+Q_OBJECT
+public:
+    VariableEditor(VInfo_ptr,QWidget* parent=0);
+    ~VariableEditor();
+
+protected Q_SLOTS:
+    void slotValueChanged();
+
+protected:
+    void apply();
+    void resetValue();
+    bool isValueChanged();
+    void readSettings();
+    void writeSettings();
+
+    VariableEditorWidget* w_;
+    QString oriVal_;
+    bool readOnly_;
+};
+
+#endif // VARIABLEEDITOR_HPP
diff --git a/Viewer/src/VariableEditorWidget.ui b/Viewer/src/VariableEditorWidget.ui
new file mode 100644
index 0000000..24b629f
--- /dev/null
+++ b/Viewer/src/VariableEditorWidget.ui
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>VariableEditorWidget</class>
+ <widget class="QWidget" name="VariableEditorWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>329</width>
+    <height>227</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="grid_" rowstretch="0,0">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item row="0" column="1">
+    <widget class="QLabel" name="nameLabel_">
+     <property name="text">
+      <string>TextLabel</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QLabel" name="label_3">
+     <property name="text">
+      <string>Value:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QPlainTextEdit" name="valueTe_">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>1</verstretch>
+      </sizepolicy>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="0">
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>Name:</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Viewer/src/VariableItemWidget.cpp b/Viewer/src/VariableItemWidget.cpp
index 6f4ca35..0812da4 100644
--- a/Viewer/src/VariableItemWidget.cpp
+++ b/Viewer/src/VariableItemWidget.cpp
@@ -30,6 +30,7 @@
 #include "WidgetNameProvider.hpp"
 
 #define _UI_VARIABLEITEMWIDGET_DEBUG
+#define _UI_VARIABLESORTMODELTEST_DEBUG
 
 //======================================
 //
@@ -49,6 +50,10 @@ VariablePropDialog::VariablePropDialog(VariableModelDataHandler *data,int define
     setAttribute(Qt::WA_DeleteOnClose);
     setModal(false);
 
+    QString wt="Edit variable";
+    wt+="  -  " + QString::fromStdString(VConfig::instance()->appLongName());
+    setWindowTitle(wt);
+
     Q_ASSERT(data_);
     Q_ASSERT(data_->count() > 0);
     Q_ASSERT(data_->count() > defineIndex_);
@@ -70,7 +75,7 @@ VariablePropDialog::VariablePropDialog(VariableModelDataHandler *data,int define
     QString path=QString::fromStdString(data_->data(0)->fullPath());
     QString h=EditorInfoLabel::formatKeyLabel("Node to modify: ") + "<b>" +
             EditorInfoLabel::formatNodeName(nodeName_) + "</b><br>";
-    h+= EditorInfoLabel::formatKeyLabel("Path: ") +  EditorInfoLabel::formatNodePath(path) + "<br>";
+    h+= EditorInfoLabel::formatKeyLabel("Node path: ") +  EditorInfoLabel::formatNodePath(path) + "<br>";
 
     VariableModelData* defineData=data_->data(defineIndex_);
     Q_ASSERT(defineData);
@@ -118,7 +123,7 @@ VariablePropDialog::VariablePropDialog(VariableModelDataHandler *data,int define
 VariablePropDialog::~VariablePropDialog()
 {
 #ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "VariablePropDialog::~VariablePropDialog -->";
+    UI_FUNCTION_LOG
 #endif
     Q_ASSERT(data_);
     data_->removeObserver(this);
@@ -137,7 +142,7 @@ void VariablePropDialog::accept()
     //var does not exists in SELECTED node
     if(!data_->data(0)->hasName(name.toStdString()))
     {
-        for(size_t i=1; i < data_->count(); i++)
+        for(int i=1; i < data_->count(); i++)
         {
             //but exists in one of the parents
             if(data_->data(i)->hasName(name.toStdString()))
@@ -343,6 +348,10 @@ VariableAddDialog::VariableAddDialog(VariableModelDataHandler *data,QWidget *par
     init();
     nameEdit_->setFocus();
 
+    QString wt="Add variable";
+    wt+="  -  " + QString::fromStdString(VConfig::instance()->appLongName());
+    setWindowTitle(wt);
+
     readSettings();
 
     WidgetNameProvider::nameChildren(this);
@@ -361,6 +370,10 @@ VariableAddDialog::VariableAddDialog(VariableModelDataHandler *data,QString name
 	valueEdit_->setText(value);
     nameEdit_->setFocus();
 
+    QString wt="Add variable";
+    wt+="  -  " + QString::fromStdString(VConfig::instance()->appLongName());
+    setWindowTitle(wt);
+
     readSettings();
 }
 
@@ -443,7 +456,7 @@ void VariableAddDialog::accept()
         return;
     }
 
-    for(size_t i=1; i <data_->count(); i++)
+    for(int i=1; i <data_->count(); i++)
     {
         if(data_->data(i)->hasName(name.toStdString()))
         {
@@ -586,7 +599,9 @@ void VariableAddDialog::readSettings()
 //
 //========================================================
 
-VariableItemWidget::VariableItemWidget(QWidget *parent) : shadowProp_(0)
+VariableItemWidget::VariableItemWidget(QWidget *parent) :
+    shadowProp_(0),
+    canSaveLastSelection_(true)
 {
 	//This item displays all the ancestors of the info object
     useAncestors_=true;
@@ -598,23 +613,24 @@ VariableItemWidget::VariableItemWidget(QWidget *parent) : shadowProp_(0)
 	//The model and the sort-filter model
 	model_=new VariableModel(data_,this);
 	sortModel_= new VariableSortModel(model_,this);
-    
+    sortModel_->setDynamicSortFilter(true);
+
     //Set the model on the view
     varView->setModel(sortModel_);
 
     varView->setSelectionBehavior(QAbstractItemView::SelectRows);
     varView->setSelectionMode(QAbstractItemView::SingleSelection);
 
-    //varView->setSelectionMode(QAbstractItemView::ExtendedSelection);
-
 #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
     varView->header()->setSectionResizeMode(1,QHeaderView::ResizeToContents);
     varView->header()->setStretchLastSection(false);
 #endif
 
-    //Shadowed variables
+    //Show shadowed variables by default
     bool showShadowed = true;
-    //We do not want to observe it!
+
+    //But we overwrite it with the config settings. This property is directly edited
+    //via the toolbutton, so we do not need to observe it.
     shadowProp_=VConfig::instance()->find("panel.variable.showShadowed");
     if(shadowProp_)
     {
@@ -634,7 +650,7 @@ VariableItemWidget::VariableItemWidget(QWidget *parent) : shadowProp_(0)
     filterLine_=new LineEdit;
     stackedWidget->addWidget(filterLine_);
 
-    //The search line editor. Its a custom widget handling its own signals and slots.
+    //The search line editor. It is a custom widget handling its own signals and slots.
     searchLine_=new VariableSearchLine(this);
     stackedWidget->addWidget(searchLine_);
     searchLine_->setView(varView);
@@ -682,8 +698,9 @@ VariableItemWidget::VariableItemWidget(QWidget *parent) : shadowProp_(0)
 	propTb->setDefaultAction(actionProp);
 	exportTb->setDefaultAction(actionExport);
 
-	//TODO: implemet it
-	actionExport->setEnabled(false);
+    //TODO: implement it
+    actionExport->setEnabled(false);
+    exportTb->setVisible(false);
 
 	//Initialise action state (it depends on the selection)
 	checkActionState();
@@ -730,18 +747,22 @@ void VariableItemWidget::clearContents()
 {
 	InfoPanelItem::clear();
     data_->clear();
+    lastSelection_.reset();
     actionAdd->setText(tr("Add &new variable"));
 }
 
 
-void VariableItemWidget::slotItemSelected(const QModelIndex& idx,const QModelIndex& prevIdx)
+void VariableItemWidget::slotItemSelected(const QModelIndex& idx,const QModelIndex& /*prevIdx*/)
 {
 #ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "VariableItemWidget::slotItemSelected -->";
-    UiLog().dbg() << "  current: " << idx << " prev: " << prevIdx;
-    UiLog().dbg() << "  in view: " << varView->currentIndex();
+    UI_FUNCTION_LOG
 #endif
 
+    //remembers the last clicked variable
+    UiLog().dbg() << idx;
+    if(canSaveLastSelection_)
+        lastSelection_=model_->indexToInfo(sortModel_->mapToSource(idx));
+
     checkActionState();
 }
 
@@ -755,8 +776,7 @@ void VariableItemWidget::updateState(const FlagSet<ChangeFlag>& flags)
 
 void VariableItemWidget::checkActionState()
 {
-	QModelIndex vIndex=varView->currentIndex();
-	QModelIndex index=sortModel_->mapToSource(vIndex);
+    QModelIndex index=sortModel_->mapToSource(varView->currentIndex());
 
     if(suspended_ || !info_)
     {
@@ -831,56 +851,47 @@ void VariableItemWidget::checkActionState()
 
 void VariableItemWidget::editItem(const QModelIndex& index)
 {
-	QString name;
-	QString value;
-	bool genVar;
-
 #ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "VariableItemWidget::editItem -->" << " index:" << index;
+    UI_FUNCTION_LOG
+    UiLog().dbg() << " index=" << index;
 #endif
 
-	QModelIndex vIndex=sortModel_->mapToSource(index);
+    QString name;
+	QString value;
+	bool genVar;
 
+	QModelIndex vIndex=sortModel_->mapToSource(index);
 #ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "  vIndex:" << vIndex;
+    UiLog().dbg() << "vIndex=" << vIndex;
 #endif
 
     int block=-1;
-    VariableModelData* data=model_->indexToData(vIndex,block);
+    if(model_->indexToData(vIndex,block))
+    {
+        Q_ASSERT(data_->count() > 0);
+        Q_ASSERT(block >=0);
 
 #ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "   block=" << block;
+        UiLog().dbg() << " block=" << block;
 #endif
 
-    //Get the data from the model
-	if(data && model_->variable(vIndex,name,value,genVar))
-	{
-        Q_ASSERT(data_->count() > 0);
-        Q_ASSERT(block >=0);
-
-        //Start edit dialog (will be deleted on close - deleteOnClose is set)
-        VariablePropDialog* d=new VariablePropDialog(data_,block,name,value,frozen_,this);
-        connect(d,SIGNAL(accepted()),
+        if(model_->variable(vIndex,name,value,genVar))
+        {
+            //Start the edit dialog (will be deleted on close - deleteOnClose is set)
+            VariablePropDialog* d=new VariablePropDialog(data_,block,name,value,frozen_,this);
+            connect(d,SIGNAL(accepted()),
                 this,SLOT(slotVariableEdited()));
-        connect(this,SIGNAL(suspendedChanged(bool)),
+            connect(this,SIGNAL(suspendedChanged(bool)),
                 d,SLOT(slotSuspendedChanged(bool)));
-        d->show();
-
-#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-        UiLog().dbg()  << "selected after: " <<   varView->currentIndex();
-#endif
+            d->show();
+        }
 	}
-
-#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "<-- editItem";
-#endif
-
 }
 
 void VariableItemWidget::duplicateItem(const QModelIndex& index)
 {
 	if(frozen_)
-			return;
+        return;
 
 #if 0
 	QString name;
@@ -955,7 +966,7 @@ void VariableItemWidget::removeItem(const QModelIndex& index)
             int row=-1;
             data_->findVariable(name.toStdString(),nodePath,genVar,block,row);
             if(block != -1 && row != -1)
-            {
+            {                
                 data_->data(block)->remove(name.toStdString());
             }
             else
@@ -974,6 +985,7 @@ void VariableItemWidget::removeItem(const QModelIndex& index)
 	}
 }
 
+//Called when the variable has been edited in the dialogue
 void VariableItemWidget::slotVariableEdited()
 {
     VariablePropDialog* d=static_cast<VariablePropDialog*>(sender());
@@ -985,8 +997,8 @@ void VariableItemWidget::slotVariableEdited()
         //do not know if it was successful or not. The model will be
         //updated through the observer when the value will actually
         //change.
-        //We always only perform the alter variable operation on the selected
-        //node i.e. on data(0) !!!
+        //We always perform the alter variable operation on the selected
+        //node i.e. on block 0 = data(0) !!!
         data_->data(0)->alter(d->name().toStdString(),d->value().toStdString());
     }
 }
@@ -996,6 +1008,8 @@ void VariableItemWidget::slotVariableAdded()
     VariableAddDialog* d=static_cast<VariableAddDialog*>(sender());
     Q_ASSERT(d);
     Q_ASSERT(data_->count() > 0);
+    //We always perform the alter variable operation on the selected
+    //node i.e. on block 0 = data(0) !!!    
     data_->data(0)->alter(d->name().toStdString(),d->value().toStdString());
 }
 
@@ -1096,65 +1110,65 @@ void VariableItemWidget::toClipboard(QString txt) const
 #endif
 }
 
-
 void VariableItemWidget::slotFilterTextChanged(QString text)
 {
 #ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "VariableItemWidget::slotFilterTextChanged -->" <<
-                     " selected before:" <<   varView->currentIndex();
+    UI_FUNCTION_LOG
 #endif
     sortModel_->setMatchText(text);
-#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "selected after:" <<   varView->currentIndex() << " " <<
-    sortModel_->data(varView->currentIndex());
-    UiLog().dbg() << "<-- slotFilterTextChanged";
-#endif
+    regainSelection();
 }
 
 void VariableItemWidget::nodeChanged(const VNode* node, const std::vector<ecf::Aspect::Type>& aspect)
 {                
 #ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "VariableItemWidget::nodeChanged -->" <<
-                     " selected before:" <<   varView->currentIndex();
+     UI_FUNCTION_LOG
 #endif
-
+    canSaveLastSelection_=false;
     if(data_->nodeChanged(node,aspect))
     {
-#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-        UiLog().dbg() << " reselect currentIndex!";
-#endif
-        //After any change done we need to reselect the current row. See issue ECFLOW-613.
-        reselectCurrent();
+        //After any change done we need to reselect the current row. See issue ECFLOW-613.        
+        regainSelection();
     }
-#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "selected after: " <<   varView->currentIndex();
-    UiLog().dbg() << "<-- nodeChanged";
-#endif
+    canSaveLastSelection_=true;
 }
 
 void VariableItemWidget::defsChanged(const std::vector<ecf::Aspect::Type>& aspect)
 {
 #ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "VariableItemWidget::defsChanged --> selected before:" <<   varView->currentIndex();
+    UI_FUNCTION_LOG
 #endif
+    canSaveLastSelection_=false;
     if(data_->defsChanged(aspect))
     {
-#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-        UiLog().dbg() << " reselect currentIndex!";
-#endif
         //After any change we need to reselect the current row. See issue ECFLOW-613.
-        reselectCurrent();
+        regainSelection();
     }
-#ifdef _UI_VARIABLEITEMWIDGET_DEBUG
-    UiLog().dbg() << "selected after: " <<   varView->currentIndex();
-    UiLog().dbg() << "<-- defsChanged";
-#endif
+    canSaveLastSelection_=true;
 }
 
-//This is a fairly complicated solution but reselection does not work otherwise
-//if the second column is selected initially!!!
-void  VariableItemWidget::reselectCurrent()
+//Try to regain the selection stored in lastSelection_ potentailly after a
+//full model reset!!!
+void  VariableItemWidget::regainSelection()
 {
+    if(lastSelection_)
+    {
+        lastSelection_->regainData();
+        if(lastSelection_->hasData())
+        {
+            QModelIndex idx=model_->infoToIndex(lastSelection_);
+            if(idx.isValid())
+            {
+                varView->setCurrentIndex(sortModel_->mapFromSource(idx));
+            }
+        }
+        else
+        {
+            lastSelection_.reset();
+        }
+    }
+
+#if 0
     QModelIndex idx=sortModel_->mapToSource(varView->currentIndex());
     if(idx.column() == 1)
     {
@@ -1164,6 +1178,7 @@ void  VariableItemWidget::reselectCurrent()
     QModelIndex sortIdx=sortModel_->mapFromSource(idx);
     varView->selectionModel()->setCurrentIndex(sortIdx,QItemSelectionModel::Rows|
                                    QItemSelectionModel::Select);
+#endif
 }
 
 //Register at the factory
diff --git a/Viewer/src/VariableItemWidget.hpp b/Viewer/src/VariableItemWidget.hpp
index b1ab14a..2a870ea 100644
--- a/Viewer/src/VariableItemWidget.hpp
+++ b/Viewer/src/VariableItemWidget.hpp
@@ -140,7 +140,7 @@ protected:
 	void removeItem(const QModelIndex& index);
     void updateState(const ChangeFlags&);
     void toClipboard(QString txt) const;
-    void reselectCurrent();
+    void regainSelection();
 
     void nodeChanged(const VNode*, const std::vector<ecf::Aspect::Type>&);
 	void defsChanged(const std::vector<ecf::Aspect::Type>&);
@@ -153,6 +153,8 @@ protected:
 	VariableSearchLine *searchLine_;
 
     VProperty* shadowProp_;
+    VInfo_ptr lastSelection_;
+    bool canSaveLastSelection_;
 };
 
 #endif
diff --git a/Viewer/src/VariableItemWidget.ui b/Viewer/src/VariableItemWidget.ui
index 25bc480..5ec4a25 100644
--- a/Viewer/src/VariableItemWidget.ui
+++ b/Viewer/src/VariableItemWidget.ui
@@ -17,7 +17,16 @@
    <property name="spacing">
     <number>2</number>
    </property>
-   <property name="margin">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
     <number>0</number>
    </property>
    <item>
@@ -183,7 +192,7 @@
      <normaloff>:/viewer/editcopy.svg</normaloff>:/viewer/editcopy.svg</iconset>
    </property>
    <property name="text">
-    <string>&Copy item</string>
+    <string>&Copy item text under cursor</string>
    </property>
    <property name="toolTip">
     <string>Copy variable</string>
@@ -233,7 +242,7 @@
   </action>
   <action name="actionCopyFull">
    <property name="text">
-    <string>Copy name and value</string>
+    <string>Copy text for both Name and Value</string>
    </property>
    <property name="toolTip">
     <string>Copy variable's name and value</string>
diff --git a/Viewer/src/VariableModel.cpp b/Viewer/src/VariableModel.cpp
index 14ad177..4803752 100644
--- a/Viewer/src/VariableModel.cpp
+++ b/Viewer/src/VariableModel.cpp
@@ -41,11 +41,17 @@ VariableModel::VariableModel(VariableModelDataHandler* data,QObject *parent) :
 	connect(data_,SIGNAL(reloadEnd()),
 					this,SLOT(slotReloadEnd()));
 
-	connect(data_,SIGNAL(addRemoveBegin(int,int)),
-				this,SLOT(slotAddRemoveBegin(int,int)));
+    connect(data_,SIGNAL(clearBegin(int,int)),
+                this,SLOT(slotClearBegin(int,int)));
 
-	connect(data_,SIGNAL(addRemoveEnd(int)),
-                this,SLOT(slotAddRemoveEnd(int)));
+    connect(data_,SIGNAL(clearEnd(int,int)),
+                this,SLOT(slotClearEnd(int,int)));
+
+    connect(data_,SIGNAL(loadBegin(int,int)),
+                this,SLOT(slotLoadBegin(int,int)));
+
+    connect(data_,SIGNAL(loadEnd(int,int)),
+                this,SLOT(slotLoadEnd(int,int)));
 
 	connect(data_,SIGNAL(dataChanged(int)),
                 this,SLOT(slotDataChanged(int)));
@@ -340,6 +346,45 @@ VariableModelData* VariableModel::indexToData(const QModelIndex& index,int& bloc
     return NULL;
 }
 
+VInfo_ptr VariableModel::indexToInfo(const QModelIndex& index) const
+{
+    if(VariableModelData* d=indexToData(index))
+    {
+        //It is a block
+        QModelIndex p=index.parent();
+
+        //It is a block
+        //if(!index.parent().isValid()) <-- this did not work
+        if(!p.isValid())
+            return d->info();
+        //it is a variable within a block
+        else
+            return d->info(index.row());
+    }
+    return VInfo_ptr();
+}
+
+QModelIndex VariableModel::infoToIndex(VInfo_ptr info) const
+{
+    if(!info)
+        return QModelIndex();
+
+    int block=-1;
+    int row=-1;
+    data_->findVariable(info,block,row);
+
+    if(block != -1)
+    {
+        QModelIndex blockIndex=index(block,0);
+        if(row != -1)
+        {
+            return index(row,0,blockIndex);
+        }
+        return blockIndex;
+    }
+
+    return QModelIndex();
+}
 
 //----------------------------------------------
 //
@@ -387,47 +432,83 @@ void VariableModel::slotReloadEnd()
 	endResetModel();
 }
 
-void VariableModel::slotAddRemoveBegin(int block,int diff)
+void VariableModel::slotClearBegin(int block,int num)
 {
-	QModelIndex parent=index(block,0);
-	if(!parent.isValid())
-		return;
+#ifdef _UI_VARIABLEMODEL_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    QModelIndex parent=index(block,0);
+    if(!parent.isValid())
+        return;
 
-	int num=rowCount(parent);
+    int rc=rowCount(parent);
+    UI_ASSERT(num >= 0," num=" << num);
+    UI_ASSERT(num == rc," num=" << num <<
+              " rowCount=" << rowCount(parent));
 
-	//Insertion
-	if(diff > 0)
-	{
-		//We add extra rows to the end
-		beginInsertRows(parent,num,num+diff-1);
-	}
-	//Deletion
-	else if(diff <0)
-	{
-		//We remove rows from the end
-		beginRemoveRows(parent,num+diff,num-1);
-	}
+    if(num > 0)
+    {
+        beginRemoveRows(parent,0,num-1);
+    }
 }
 
-void VariableModel::slotAddRemoveEnd(int diff)
+void VariableModel::slotClearEnd(int block,int num)
 {
-	//Insertion
-	if(diff > 0)
-	{
-		endInsertRows();
-	}
-	//Deletion
-	else if(diff <0)
-	{
-		endRemoveRows();
-	}
+#ifdef _UI_VARIABLEMODEL_DEBUG
+    UI_FUNCTION_LOG
+#endif
+
+    QModelIndex parent=index(block,0);
+    if(!parent.isValid())
+        return;
+
+    UI_ASSERT(num >= 0,"num=" << num);
+    if(num > 0)
+    {
+        endRemoveRows();
+    }
+}
+
+void VariableModel::slotLoadBegin(int block,int num)
+{
+#ifdef _UI_VARIABLEMODEL_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    QModelIndex parent=index(block,0);
+    if(!parent.isValid())
+        return;
+
+    int rc=rowCount(parent);
+    UI_ASSERT(num >= 0,"num=" << num);
+    UI_ASSERT(rc==0,"rowCount=" << rowCount(parent));
+
+    if(num > 0)
+    {
+        beginInsertRows(parent,0,num-1);
+    }
+}
+
+void VariableModel::slotLoadEnd(int block,int num)
+{
+#ifdef _UI_VARIABLEMODEL_DEBUG
+    UI_FUNCTION_LOG
+#endif
+    QModelIndex parent=index(block,0);
+    if(!parent.isValid())
+        return;
+
+    UI_ASSERT(num >= 0,"num=" << num);
+    if(num > 0)
+    {
+        endInsertRows();
+    }
 }
 
 //It must be called after any data change
 void VariableModel::slotDataChanged(int block)
 {
 #ifdef _UI_VARIABLEMODEL_DEBUG
-    UiLog().dbg() << "VariableModel::slotDataChanged -->";
+    UI_FUNCTION_LOG
 #endif
     QModelIndex blockIndex0=index(block,0);
 	QModelIndex blockIndex1=index(block,1);
@@ -435,14 +516,9 @@ void VariableModel::slotDataChanged(int block)
 #ifdef _UI_VARIABLEMODEL_DEBUG
     UiLog().dbg() << " emit dataChanged:" << " " << blockIndex0 << " " << blockIndex1;
 #endif
-	Q_EMIT dataChanged(blockIndex0,blockIndex1);
-
-    //We need to rerun the filter in the proxy model!
-    Q_EMIT filterChanged();
 
-#ifdef _UI_VARIABLEMODEL_DEBUG
-    UiLog().dbg() << "<-- slotDataChanged";
-#endif
+    //This will sort and filter the block
+    Q_EMIT dataChanged(blockIndex0,blockIndex1);
 }
 
 //=======================================================================
@@ -510,14 +586,16 @@ void VariableSortModel::print(const QModelIndex idx)
 void VariableSortModel::slotFilterChanged()
 {
     if(matchMode_ == FilterMode)
+    {
         invalidate();
+    }
 }
 
 void VariableSortModel::slotRerunFilter()
 {
 #ifdef _UI_VARIABLEMODEL_DEBUG
    UiLog().dbg() << "VariableSortModel::slotRerunFilter-->";
-#endif
+#endif     
    invalidate();
 }
 
@@ -546,7 +624,8 @@ bool VariableSortModel::lessThan(const QModelIndex &sourceLeft, const QModelInde
 	//For variables we simply sort according to the string
 	else
 	{
-		return varModel_->data(sourceLeft,Qt::DisplayRole).toString() < varModel_->data(sourceRight,Qt::DisplayRole).toString();
+    //UiLog().dbg() << varModel_->data(sourceLeft,Qt::DisplayRole).toString() << " " << varModel_->data(sourceRight,Qt::DisplayRole).toString();
+        return varModel_->data(sourceLeft,Qt::DisplayRole).toString() < varModel_->data(sourceRight,Qt::DisplayRole).toString();
 	}
 	return true;
 }
@@ -642,4 +721,57 @@ QModelIndexList VariableSortModel::match(const QModelIndex& start,int role,const
 	return matchLst_;
 }
 
+#if 0
+void VariableSortModel::test()
+{
+    UI_FUNCTION_LOG
+    QModelIndex idx;
+    test(idx);
+    testSource(idx);
+}
 
+void VariableSortModel::test(const QModelIndex& p)
+{
+    int num=rowCount(p);
+    for(int i=0; i < num; i++)
+    {
+        QModelIndex idx=index(i,0,p);
+        QModelIndex sIdx=mapToSource(idx);
+        if(!sIdx.isValid())
+        {
+            UiLog().dbg() << " idx=" << idx;
+            Q_ASSERT(sIdx.isValid());
+        }
+        //UiLog().dbg() << idx.data().toString() << " " << sIdx.data().toString();
+
+        if(idx.data().toString() != sIdx.data().toString())
+        {
+            UI_ASSERT(0,"filter=" << idx.data().toString() <<
+                      " source=" << sIdx.data().toString());
+        }
+
+        test(idx);
+    }
+}
+
+void VariableSortModel::testSource(const QModelIndex& p)
+{
+    int num=varModel_->rowCount(p);
+    for(int i=0; i < num; i++)
+    {
+        QModelIndex sIdx=varModel_->index(i,0,p);
+        QModelIndex idx=mapFromSource(sIdx);
+        if(!idx.isValid())
+        {
+            UiLog().dbg() << " idx=" << idx;
+            Q_ASSERT(sIdx.isValid());
+        }
+        if(idx.data().toString() != sIdx.data().toString())
+        {
+            UI_ASSERT(0,"filter=" << idx.data().toString() <<
+                      " source=" << sIdx.data().toString());
+        }
+        testSource(idx);
+    }
+}
+#endif
diff --git a/Viewer/src/VariableModel.hpp b/Viewer/src/VariableModel.hpp
index 132b129..c7bcc10 100644
--- a/Viewer/src/VariableModel.hpp
+++ b/Viewer/src/VariableModel.hpp
@@ -39,14 +39,18 @@ public:
 
     VariableModelData* indexToData(const QModelIndex& index) const;
     VariableModelData* indexToData(const QModelIndex& index,int& block) const;
+    VInfo_ptr indexToInfo(const QModelIndex& index) const;
+    QModelIndex infoToIndex(VInfo_ptr info) const;
 
 	bool isVariable(const QModelIndex & index) const;
 
 public Q_SLOTS:
 	void slotReloadBegin();
 	void slotReloadEnd();
-	void slotAddRemoveBegin(int block,int diff);
-	void slotAddRemoveEnd(int diff);
+    void slotClearBegin(int block,int num);
+    void slotClearEnd(int block,int num);
+    void slotLoadBegin(int block,int num);
+    void slotLoadEnd(int block,int num);
     void slotDataChanged(int);
 
 Q_SIGNALS:
@@ -94,6 +98,12 @@ public:
 	
     QModelIndexList match(const QModelIndex& start,int role,const QVariant& value,int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags( Qt::MatchStartsWith | Qt::MatchWrap )) const;
 
+#if 0
+    void test();
+    void test(const QModelIndex& p);
+    void testSource(const QModelIndex& p);
+#endif
+
 public Q_SLOTS:
     void slotShowShadowed(bool);
 
diff --git a/Viewer/src/VariableModelData.cpp b/Viewer/src/VariableModelData.cpp
index ef499a8..34e07e9 100644
--- a/Viewer/src/VariableModelData.cpp
+++ b/Viewer/src/VariableModelData.cpp
@@ -12,7 +12,11 @@
 #include "ServerHandler.hpp"
 #include "UserMessage.hpp"
 #include "UiLog.hpp"
+#include "UIDebug.hpp"
 #include "VariableModelDataObserver.hpp"
+#include "VAttribute.hpp"
+#include "VGenVarAttr.hpp"
+#include "VItemPathParser.hpp"
 #include "VNode.hpp"
 #include "VNState.hpp"
 
@@ -20,8 +24,6 @@
 
 static std::string defaultStr("");
 
-QStringList VariableModelData::readOnlyVars_;
-
 #define _UI_VARIABLEMODELDATA_DEBUG
 
 //==========================================
@@ -34,12 +36,6 @@ VariableModelData::VariableModelData(VInfo_ptr info) :
 		info_(info)
 {
 	reload();
-
-	if(readOnlyVars_.isEmpty())
-	{
-		readOnlyVars_ << "ECF_NODE" << "ECF_HOST" << "ECF_PORT" << "ECF_PID"
-		      << "ECF_VERSION" << "ECF_LISTS";
-	}
 }
 
 VariableModelData::~VariableModelData()
@@ -76,6 +72,8 @@ void VariableModelData::reset(const std::vector<Variable>& vars,const std::vecto
     }
 }
 
+//Remove the generated variables that have the same name as a user variable. User
+//variables take precedence over generated variables.
 void VariableModelData::removeDuplicates(const std::vector<Variable>& vars,std::vector<Variable>& genVars)
 {
     std::vector<Variable> gvOri=genVars;
@@ -131,6 +129,29 @@ VNode* VariableModelData::node() const
 	return NULL;
 }
 
+VInfo_ptr VariableModelData::info(int index) const
+{
+    if(info_)
+    {
+        if(index < 0 || index >= varNum())
+            return VInfo_ptr();
+
+        std::string p=info_->storedPath();
+        if(!isGenVar(index))
+        {
+            p=VItemPathParser::encodeAttribute(p,vars_[index].name(),"var");
+        }
+        else
+        {
+            p=VItemPathParser::encodeAttribute(p,genVars_[index-vars_.size()].name(),"genvar");
+        }
+
+        return VInfo::createFromPath(p);
+    }
+
+    return VInfo_ptr();
+}
+
 const std::string& VariableModelData::name(int index) const
 {
 	if(index < 0 || index >= varNum())
@@ -230,6 +251,7 @@ int VariableModelData::indexOf(const std::string& varName,bool genVar) const
 
     for(std::vector<Variable>::const_iterator it=genVars_.begin(); it != genVars_.end(); ++it)
     {
+        idx++;
         if((*it).name() == varName)
         {
             return idx;
@@ -239,6 +261,7 @@ int VariableModelData::indexOf(const std::string& varName,bool genVar) const
     return -1;
 }
 
+#if 0
 void VariableModelData::buildAlterCommand(std::vector<std::string>& cmd,
 		                            const std::string& action, const std::string& type,
 		                            const std::string& name,const std::string& value)
@@ -257,11 +280,12 @@ void VariableModelData::buildAlterCommand(std::vector<std::string>& cmd,
 	cmd.push_back("<full_name>");
 
 }
+#endif
 
 void VariableModelData::setValue(int index,const std::string& val)
 {
 	std::vector<std::string> cmd;
-	buildAlterCommand(cmd,"change","variable",name(index),val);
+    VAttribute::buildAlterCommand(cmd,"change","variable",name(index),val);
 
 	ServerHandler::command(info_,cmd);
 }
@@ -286,7 +310,7 @@ void VariableModelData::alter(const std::string& name,const std::string& val)
     }
 
     std::vector<std::string> cmd;
-    buildAlterCommand(cmd,mode,"variable",name,val);
+    VAttribute::buildAlterCommand(cmd,mode,"variable",name,val);
     ServerHandler::command(info_,cmd);
 }
 
@@ -294,21 +318,20 @@ void VariableModelData::alter(const std::string& name,const std::string& val)
 void VariableModelData::add(const std::string& name,const std::string& val)
 {
 	std::vector<std::string> cmd;
-    buildAlterCommand(cmd,(hasName(name))?"change":"add","variable",name,val);
-
+    VAttribute::buildAlterCommand(cmd,(hasName(name))?"change":"add","variable",name,val);
 	ServerHandler::command(info_,cmd);
 }
 
 void VariableModelData::remove(const std::string& varName)
 {
     std::vector<std::string> cmd;
-    buildAlterCommand(cmd,"delete","variable",varName,"");
+    VAttribute::buildAlterCommand(cmd,"delete","variable",varName,"");
     ServerHandler::command(info_,cmd);
 }
 
 bool VariableModelData::isGenVar(int index) const
 {
-	return (index >= vars_.size());
+    return (index >= static_cast<int>(vars_.size()));
 }
 
 bool VariableModelData::isGenVar(const std::string& n) const
@@ -330,7 +353,7 @@ bool VariableModelData::isReadOnly(int index) const
 
 bool VariableModelData::isReadOnly(const std::string& varName) const
 {
-	return readOnlyVars_.contains(QString::fromStdString(varName));
+    return VGenVarAttr::isReadOnly(varName);
 }
 
 bool VariableModelData::isShadowed(int index) const
@@ -355,10 +378,6 @@ void VariableModelData::latestVars(std::vector<Variable>& v,std::vector<Variable
 
 bool VariableModelData::updateShadowed(std::set<std::string>& names)
 {
-#ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "VariableModelData::updateShadowed --> node=" << name();
-#endif
-
     std::set<std::string> ori=shadowed_;
     shadowed_.clear();
     bool changed=false;
@@ -381,11 +400,11 @@ bool VariableModelData::updateShadowed(std::set<std::string>& names)
         }
     }
 
-    for(unsigned int i=0; i < vars_.size(); i++)
+    for(std::size_t i=0; i < vars_.size(); i++)
     {
         names.insert(vars_[i].name());
     }
-    for(unsigned int i=0; i < genVars_.size(); i++)
+    for(std::size_t i=0; i < genVars_.size(); i++)
     {
         names.insert(genVars_[i].name());
     }
@@ -400,10 +419,6 @@ bool VariableModelData::updateShadowed(std::set<std::string>& names)
     UiLog().dbg() << " changed: " << changed;
 #endif
 
-#ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "<-- updateShadowed";
-#endif
-
     return changed;
 }
 
@@ -433,6 +448,8 @@ int VariableModelData::checkUpdateDiff(std::vector<Variable>& v,std::vector<Vari
 {
     if(info_ && info_->node() && v.empty() && vg.empty())
 	{
+        //get the current set of variables from the node/server. This might be different
+        //to the ones we store.
         latestVars(v,vg);
     }
 
@@ -446,7 +463,7 @@ int VariableModelData::checkUpdateDiff(std::vector<Variable>& v,std::vector<Vari
 bool VariableModelData::update(const std::vector<Variable>& v,const std::vector<Variable>& vg)
 {
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "VariableModelData::update -->";
+    UI_FUNCTION_LOG
 #endif
 
 #if 0
@@ -461,15 +478,17 @@ bool VariableModelData::update(const std::vector<Variable>& v,const std::vector<
 
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
     UiLog().dbg() << " new list of variables:";
-    for(size_t i=0; i < v.size(); i++)
+    for(std::size_t i=0; i < v.size(); i++)
          UiLog().dbg() << "  " <<  v[i].name() << "=" << v[i].theValue();
     UiLog().dbg() << "   new list of generated variables:";
-    for(size_t i=0; i < vg.size(); i++)
+    for(std::size_t i=0; i < vg.size(); i++)
         UiLog().dbg() << "  " << vg[i].name() << "=" << vg[i].theValue();
 #endif
 
     //We must have the same number of variables
-    assert(v.size() + vg.size() == vars_.size() + genVars_.size());
+    UI_ASSERT(v.size() + vg.size() == vars_.size() + genVars_.size(),
+              "v.size()=" << v.size() <<  " vg.size()=" <<  vg.size() <<
+              " vars_.size()=" << vars_.size() << " genVars_.size()" << genVars_.size());
 
     bool changed=false;
     if(v.size() != vars_.size() || vg.size() != genVars_.size())
@@ -483,12 +502,18 @@ bool VariableModelData::update(const std::vector<Variable>& v,const std::vector<
     }
     else
     {
-        for(unsigned int i=0; i < vars_.size(); i++)
+        UI_ASSERT(v.size() == vars_.size(),
+                  "v.size()=" << v.size() << " vars_.size()=" << vars_.size());
+
+        UI_ASSERT(vg.size() == genVars_.size(),
+                  "vg.size()=" << vg.size() << " genVars_.size()=" << genVars_.size());
+
+        for(std::size_t i=0; i < vars_.size(); i++)
         {
             if(vars_[i].name() != v[i].name() || vars_[i].theValue() != v[i].theValue())
             {                
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-                UiLog().dbg() << "   variable changed! name: " << vars_[i].name() << " -> " <<
+                UiLog().dbg() << " variable changed! name: " << vars_[i].name() << " -> " <<
                            v[i].name()  << " value: " <<   vars_[i].theValue() << " -> " <<  v[i].theValue();
 #endif
                 changed=true;
@@ -498,12 +523,12 @@ bool VariableModelData::update(const std::vector<Variable>& v,const std::vector<
 
         if(changed == false)
         {
-            for(unsigned int i=0; i < genVars_.size(); i++)
+            for(std::size_t i=0; i < genVars_.size(); i++)
             {
                 if(genVars_[i].name() != vg[i].name() || genVars_[i].theValue() != vg[i].theValue())
                 {
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-                    UiLog().dbg() << "   generated variable changed! name: " << genVars_[i].name() << " -> " <<
+                    UiLog().dbg() << " generated variable changed! name: " << genVars_[i].name() << " -> " <<
                            vg[i].name()  << " value: " <<   genVars_[i].theValue() << " -> " << vg[i].theValue();
 #endif
                     changed=true;
@@ -518,16 +543,11 @@ bool VariableModelData::update(const std::vector<Variable>& v,const std::vector<
 		vars_=v;
 		genVars_=vg;        
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-        UiLog().dbg() << "   updated vars and genvars";
+        UiLog().dbg() << " updated vars and genvars";
 #endif
 	}
 
-#ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "<-- update";
-#endif
-
 	return changed;
-
 }
 
 //==========================================
@@ -600,7 +620,7 @@ void VariableModelDataHandler::reload()
 bool VariableModelDataHandler::updateShadowed()
 {
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "VariableModelDataHandler::updateShadowed -->";
+    UI_FUNCTION_LOG
 #endif
 
     bool shadowChanged=false;
@@ -611,19 +631,22 @@ bool VariableModelDataHandler::updateShadowed()
         return shadowChanged;
 
     //There are no shadowed vars in the first node
-    for(size_t i=0; i < data_[0]->varNum(); i++)
+    std::size_t num=data_[0]->varNum();
+    for(std::size_t i=0; i < num; i++)
     {
         names_.insert(data_[0]->name(i));
     }
 
-    for(size_t i=1; i < data_.size(); i++)
+    std::size_t dataNum=data_.size();
+    for(std::size_t i=1; i < dataNum; i++)
     {
         if(data_[i]->updateShadowed(names_))
             shadowChanged=true;
     }
 
-#ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "   names:";
+//#ifdef _UI_VARIABLEMODELDATA_DEBUG
+#if 0
+    UiLog().dbg() << " names:";
     for(std::set<std::string>::const_iterator it=names_.begin(); it != names_.end(); ++it)
     {
         UiLog().dbg() << "      " + *it;
@@ -655,7 +678,7 @@ void VariableModelDataHandler::clear(bool emitSignal)
 
 int VariableModelDataHandler::varNum(int index) const
 {
-	if(index >=0 && index < data_.size())
+    if(index >=0 && index < static_cast<int>(data_.size()))
 		return data_.at(index)->varNum();
 
 	return -1;
@@ -663,7 +686,7 @@ int VariableModelDataHandler::varNum(int index) const
 
 VariableModelData* VariableModelDataHandler::data(int index) const
 {
-	if(index >=0 && index < data_.size())
+    if(index >=0 && index < static_cast<int>(data_.size()))
 		return data_.at(index);
 
 	return 0;
@@ -673,7 +696,7 @@ VariableModelData* VariableModelDataHandler::data(int index) const
 bool VariableModelDataHandler::nodeChanged(const VNode* node, const std::vector<ecf::Aspect::Type>& aspect)
 {
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "VariableModelDataHandler::nodeChanged -->";
+    UI_FUNCTION_LOG
 #endif
     int dataIndex=-1;
 	for(unsigned int i=0; i < data_.size(); i++)
@@ -692,9 +715,6 @@ bool VariableModelDataHandler::nodeChanged(const VNode* node, const std::vector<
 
     bool retVal=updateVariables(dataIndex);
 
-#ifdef _UI_VARIABLEMODELDATA_DEBUG
-            UiLog().dbg() << "<-- nodeChanged";
-#endif
     if(retVal)
         broadcastUpdate();
 
@@ -705,109 +725,114 @@ bool VariableModelDataHandler::nodeChanged(const VNode* node, const std::vector<
 bool VariableModelDataHandler::defsChanged(const std::vector<ecf::Aspect::Type>& aspect)
 {
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "VariableModelDataHandler::defsChanged -->";
+    UI_FUNCTION_LOG
 #endif
 
     if(data_.size() == 0)
     {
-#ifdef _UI_VARIABLEMODELDATA_DEBUG
-        UiLog().dbg() << "<-- defsChanged";
-#endif
         return false;
     }
 
     int dataIndex=data_.size()-1;
-    Q_ASSERT(dataIndex >=0 && dataIndex < data_.size());
+    Q_ASSERT(dataIndex >=0 && dataIndex < static_cast<int>(data_.size()));
     VariableModelData* d=data_.at(data_.size()-1);
     Q_ASSERT(d);
     Q_ASSERT(d->type() == "server");
 
     bool retVal=updateVariables(dataIndex);
 
-#ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "<-- defsChanged";
-#endif
-
     if(retVal)
         broadcastUpdate();
 
     return retVal;
 }
 
-//It is called when the server defs was changed
 bool VariableModelDataHandler::updateVariables(int dataIndex)
 {
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-    UiLog().dbg() << "VariableModelDataHandler::updateVariables -->";
+    UI_FUNCTION_LOG
+    UiLog().dbg() << " dataIndex=" << dataIndex;
 #endif
 
     bool retVal=false;
 
-    //There is no notification about generated variables. Basically they can change at any update!!
-    //So we have to check all the variables at every update!!
+    //There is no notification about generated variables. Basically they can
+    //change at any update!! So we have to check all the variables at every update!!
     std::vector<Variable> v;
     std::vector<Variable> vg;
 
     //Get the current set of variables and check if the total number of variables
-    //has changed. At this point v and vg do not contain any duplicates.
-    int cntDiff=data_.at(dataIndex)->checkUpdateDiff(v,vg);
+    //has changed. At this point v and vg do not contain any duplicates (within the
+    //same block the user variables take precedence over the generated variables)
+    int cntDiff=data_[dataIndex]->checkUpdateDiff(v,vg);
 
-    //If the number of the variables is not the same as we store we reset the given block in the model
+    //If the number of the variables is not the same that we store
+    //we reset the given block in the model
     if(cntDiff != 0)
     {
+        const int numOld=data_[dataIndex]->varNum(); //the current num in the model
+        const int numNew=v.size()+vg.size(); //the new num
+
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-        UiLog().dbg() << "    cntDiff=" << cntDiff;
+        UiLog().dbg() << " cntDiff=" << cntDiff << " numOld=" << numOld <<
+                         " numNew=" << numNew;
 #endif
-        const int numNew=v.size()+vg.size();
 
-        //Notifies the model that rows will be added or removed for this data item
-        Q_EMIT addRemoveBegin(dataIndex,cntDiff);
+        //Clear the block's contents in the model
+        Q_EMIT clearBegin(dataIndex,numOld);
+        data_[dataIndex]->clear();
+        Q_EMIT clearEnd(dataIndex,numOld);
+
+        //Load the new data for the block in the model
+        Q_EMIT loadBegin(dataIndex,numNew);
+        data_[dataIndex]->reset(v,vg);
+        Q_EMIT loadEnd(dataIndex,numNew);
 
-        //Reset the variables using v and vg.
-        data_.at(dataIndex)->reset(v,vg);
-        Q_ASSERT(data_.at(dataIndex)->varNum() == numNew);
+        Q_ASSERT(data_[dataIndex]->varNum() == numNew);
 
-        //Notifies the model that the change happened
-        Q_EMIT addRemoveEnd(cntDiff);
+        //At this point the block is filtered and sorted!!!!
 
         //Check if the shadowed list of variables changed
         if(updateShadowed())
         {
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-            UiLog().dbg() << "   emit rerunFilter()";
+            UiLog().dbg() << " emit rerunFilter";
 #endif
+            //We need to rerun the filter!!
             Q_EMIT rerunFilter();
-        }
-        //The shadowed list did not change
+        }        
+#if 0
         else
         {
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-            UiLog().dbg() << "   emit dataChanged";
+            UiLog().dbg() << " emit dataChanged";
 #endif
             //Update the data item in the model
-            Q_EMIT dataChanged(dataIndex);
+            //Q_EMIT dataChanged(dataIndex);
         }
+#endif
 
         retVal=true;
     }
     //Check if some variables' name or value changed
     else
-    {
+    {      
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-        UiLog().dbg() << "   Change: NODE_VARIABLE";
+        UiLog().dbg() << " cntDiff=" << cntDiff;
 #endif
+        Q_ASSERT(cntDiff==0);
         //At this point we must have the same number of vars
         const int numNew=v.size()+vg.size();
-        Q_ASSERT(data_.at(dataIndex)->varNum() == numNew);
+        Q_ASSERT(data_[dataIndex]->varNum() == numNew);
 
-        //Find out if any names chhanged
-        bool nameChanged=data_.at(dataIndex)->checkUpdateNames(v,vg);
+        //Find out if any names changed
+        bool nameChanged=data_[dataIndex]->checkUpdateNames(v,vg);
 
         //Update the names/values
-        if(data_.at(dataIndex)->update(v,vg))
+        if(data_[dataIndex]->update(v,vg))
         {
 #ifdef _UI_VARIABLEMODELDATA_DEBUG
-            UiLog().dbg() << "   Variable name or value changed";
+            UiLog().dbg() << " Variable name or value changed";
 #endif
             //At this point the stored variables are already updated
             if(nameChanged)
@@ -817,8 +842,10 @@ bool VariableModelDataHandler::updateVariables(int dataIndex)
                      Q_EMIT rerunFilter();
                  }
                  else
+                 {
                      //Update the data item in the model
                      Q_EMIT dataChanged(dataIndex);
+                 }
             }
             else
             {
@@ -829,10 +856,6 @@ bool VariableModelDataHandler::updateVariables(int dataIndex)
         retVal=true;
     }
 
-#ifdef _UI_VARIABLEMODELDATA_DEBUG
-        UiLog().dbg() << "<-- updateVariables";
-#endif
-
     return retVal;
 }
 
@@ -866,9 +889,48 @@ void VariableModelDataHandler::findVariable(const std::string& name,const std::s
     }
 }
 
+void VariableModelDataHandler::findVariable(VInfo_ptr info,int& block,int& row) const
+{
+    block=-1;
+    row=-1;
 
+    findBlock(info,block);
+    if(block!= -1 && info && info->isAttribute())
+    {
+        if(VAttribute *a=info->attribute())
+        {
+            std::string name=a->strName();
+            std::string tName=a->typeName();
+            if(!name.empty() &&
+              (tName=="var" || tName == "genvar") )
+            {
+                row=data_[block]->indexOf(name,(tName == "genvar"));
+            }
+         }
+    }
+}
 
+void VariableModelDataHandler::findBlock(VInfo_ptr info,int& block) const
+{
+    block=-1;
+
+    if(!info)
+        return;
 
+    std::string p=info->nodePath();
+    if(!p.empty())
+    {
+        int n=count();
+        for(int i=0; i < n; i++)
+        {
+            if(data_[i]->info_ && data_[i]->info_->nodePath() == p)
+            {
+                block=i;
+                return;
+            }
+        }
+    }
+}
 
 void VariableModelDataHandler::addObserver(VariableModelDataObserver* o)
 {
diff --git a/Viewer/src/VariableModelData.hpp b/Viewer/src/VariableModelData.hpp
index 50cfd0a..3b270a3 100644
--- a/Viewer/src/VariableModelData.hpp
+++ b/Viewer/src/VariableModelData.hpp
@@ -38,20 +38,23 @@ public:
 	const std::string& name(int index) const;
     const std::string& value(int index) const;
     const std::string& value(const std::string name,bool&) const;
+    VInfo_ptr info() const {return info_;}
+    VInfo_ptr info(int index) const;
     int indexOf(const std::string& varName,bool genVar) const;
     bool isGenVar(const std::string& varName) const;
     bool isGenVar(int index) const;
 	bool isReadOnly(int index) const;
-	bool isReadOnly(const std::string& varName) const;
+    bool isReadOnly(const std::string& varName) const;
     bool isShadowed(int index) const;
     int varNum() const;
 	bool hasName(const std::string& n) const;
 	VNode* node() const;
 
+#if 0
 	void buildAlterCommand(std::vector<std::string>& cmd,
 			           const std::string& action, const std::string& type,
 			           const std::string& name,const std::string& value);
-
+#endif
     void clear();  
 	void setValue(int index,const std::string& val);
     void alter(const std::string& name,const std::string& val);
@@ -75,8 +78,6 @@ protected:
 	std::vector<Variable> genVars_;
     std::set<std::string> shadowed_;
 	VInfo_ptr info_;
-
-	static QStringList readOnlyVars_;
 };
 
 class VariableModelDataHandler : public QObject
@@ -94,17 +95,26 @@ public:
 	VariableModelData* data(int index) const;
     void findVariable(const std::string& name,const std::string& nodePath,
                                                 bool genVar,int& block,int& row) const;
+
+    void findVariable(VInfo_ptr info,int& block,int& row) const;
+    void findBlock(VInfo_ptr info,int& block) const;
+
     bool nodeChanged(const VNode* node, const std::vector<ecf::Aspect::Type>&);
     bool defsChanged(const std::vector<ecf::Aspect::Type>&);
     const std::string& value(const std::string& node,const std::string& name,bool&) const;
     void addObserver(VariableModelDataObserver*);
     void removeObserver(VariableModelDataObserver*);
 
+
 Q_SIGNALS:
 	void reloadBegin();
 	void reloadEnd();
+    void clearBegin(int,int);
+    void clearEnd(int,int);
+    void loadBegin(int,int);
+    void loadEnd(int,int);
 	void addRemoveBegin(int,int);
-	void addRemoveEnd(int);
+    void addRemoveEnd(int);
     void dataChanged(int);
     void rerunFilter();
 
diff --git a/Viewer/src/VariableView.cpp b/Viewer/src/VariableView.cpp
index 0ffd334..e8a3890 100644
--- a/Viewer/src/VariableView.cpp
+++ b/Viewer/src/VariableView.cpp
@@ -11,6 +11,7 @@
 
 #include <QApplication>
 #include <QDebug>
+#include <QHeaderView>
 #include <QImageReader>
 #include <QItemSelectionModel>
 #include <QPainter>
@@ -291,6 +292,8 @@ VariableView::VariableView(QWidget* parent) : TreeView(parent)
     //setAlternatingRowColors(true);
     setSortingEnabled(true);
 
+    header()->setSortIndicator(0,Qt::AscendingOrder);
+
 	//Context menu
 	setContextMenuPolicy(Qt::ActionsContextMenu);
 }
diff --git a/Viewer/src/ViewerMain.cpp b/Viewer/src/ViewerMain.cpp
index 7396931..de54339 100644
--- a/Viewer/src/ViewerMain.cpp
+++ b/Viewer/src/ViewerMain.cpp
@@ -112,8 +112,8 @@ int main(int argc, char **argv)
     // startup - via the session manager, or straight to the main window?
     bool startMainWindow = true;
 
-    //Initialise the session. We have to call thi before VConfig::init() because
-    //some settings Vconfig loads are session-dependent.
+    //Initialise the session. We have to call this before VConfig::init() because
+    //some settings VConfig loads are session-dependent.
     if (SessionHandler::requestStartupViaSessionManager())
     {
         SessionDialog sessionDialog;
diff --git a/Viewer/src/WhyItemWidget.cpp b/Viewer/src/WhyItemWidget.cpp
index 9f91887..ed509aa 100644
--- a/Viewer/src/WhyItemWidget.cpp
+++ b/Viewer/src/WhyItemWidget.cpp
@@ -27,9 +27,15 @@
 //
 //========================================================
 
+//This item will be updated (the why? regenerated) at the end of each sync, so it does not need
+//to observe the node it stores. The reason for this is that the why? can basically depend on
+//anything in the tree. So anything in a sync can potentally have an impact on it.
 WhyItemWidget::WhyItemWidget(QWidget *parent) : HtmlItemWidget(parent)
 {
-	messageLabel_->hide();
+    //We will not keep the contents when the item becomes unselected
+    unselectedFlags_.clear();
+
+    messageLabel_->hide();
 	fileLabel_->hide();
 
     //Will be used for ECFLOW-901
@@ -80,6 +86,7 @@ WhyItemWidget::WhyItemWidget(QWidget *parent) : HtmlItemWidget(parent)
 
 WhyItemWidget::~WhyItemWidget()
 {
+    clearContents();
 }
 
 
@@ -96,8 +103,16 @@ void WhyItemWidget::reload(VInfo_ptr info)
         return;
 
     clearContents();
-	info_=info;
 
+    //set the info. we do not need to observe the node!!!
+    info_=info;
+
+    load();
+}
+
+void WhyItemWidget::load()
+{
+    textEdit_->clear();
     if(info_)
     {
         textEdit_->insertHtml(why());
@@ -188,10 +203,50 @@ QString WhyItemWidget::makeHtml(const std::vector<std::string>& rawTxt) const
     return s;
 }
 
+void WhyItemWidget::updateState(const FlagSet<ChangeFlag>& flags)
+{
+    if(flags.isSet(SuspendedChanged))
+    {
+        //If we are here this item is active but not selected!
+
+        //When it becomes suspended we need to clear everything since the
+        //tree is probably cleared at this point
+        if(suspended_)
+        {
+            textEdit_->clear();
+        }
+        //When we leave the suspended state we need to reload everything
+        else
+        {
+            load();
+        }
+    }
+
+    Q_ASSERT(!flags.isSet(SelectedChanged));
+
+}
+
 void WhyItemWidget::anchorClicked(const QUrl& link)
 {
     linkSelected(link.path().toStdString());
 }
 
+//After each sync we need to reaload the contents
+void WhyItemWidget::serverSyncFinished()
+{
+    if(frozen_)
+        return;
+
+    //We do not track changes when the item is not selected
+    if(!selected_ || !active_)
+        return;
+
+    if(!info_)
+        return;
+
+    //For any change we nee to reload
+    load();
+}
+
 static InfoPanelItemMaker<WhyItemWidget> maker1("why");
 
diff --git a/Viewer/src/WhyItemWidget.hpp b/Viewer/src/WhyItemWidget.hpp
index f51dcb7..05e6752 100644
--- a/Viewer/src/WhyItemWidget.hpp
+++ b/Viewer/src/WhyItemWidget.hpp
@@ -38,9 +38,11 @@ protected Q_SLOTS:
     void anchorClicked(const QUrl& link);
 
 protected:
-    void updateState(const ChangeFlags&) {}
+    void updateState(const ChangeFlags&);
+    void serverSyncFinished();
 
 private:
+    void load();
     QString why() const;
     QString makeHtml(const std::vector<std::string>&,const std::vector<std::string>&) const;
     QString makeHtml(const std::vector<std::string>&) const;
diff --git a/Viewer/src/ZombieItemWidget.cpp b/Viewer/src/ZombieItemWidget.cpp
index b354f59..2d3d217 100644
--- a/Viewer/src/ZombieItemWidget.cpp
+++ b/Viewer/src/ZombieItemWidget.cpp
@@ -45,12 +45,20 @@ ZombieItemWidget::ZombieItemWidget(QWidget *parent) :
 	connect(zombieView->selectionModel(),SIGNAL(currentChanged(QModelIndex,QModelIndex)),
 			this,SLOT(slotItemSelected(QModelIndex,QModelIndex)));
 
+    connect(zombieView,SIGNAL(doubleClicked(const QModelIndex&)),
+            this,SLOT(slotDoubleClicked(const QModelIndex&)));
+
 	//Build context menu
-	zombieView->addAction(actionRescue);
+    QAction* sep1=new QAction(this);
+    sep1->setSeparator(true);
+
+    zombieView->addAction(actionRescue);
     zombieView->addAction(actionFoboff);
 	zombieView->addAction(actionKill);
 	zombieView->addAction(actionTerminate);
-	zombieView->addAction(actionDelete);
+    zombieView->addAction(actionDelete);
+    zombieView->addAction(sep1);
+    zombieView->addAction(actionLookup);
 
 	//Add actions for the pushbuttons
 	terminateTb_->setDefaultAction(actionTerminate);
@@ -170,6 +178,11 @@ void ZombieItemWidget::on_actionKill_triggered()
 	command("zombie_kill");
 }
 
+void ZombieItemWidget::on_actionLookup_triggered()
+{
+    lookup(zombieView->currentIndex());
+}
+
 void ZombieItemWidget::on_reloadTb__clicked(bool)
 {
 	updateContents();
@@ -206,6 +219,34 @@ void ZombieItemWidget::command(const std::string& cmdName)
 }
 
 
+void ZombieItemWidget::lookup(const QModelIndex& index)
+{
+    if(!info_ || !info_->server())
+        return;
+
+    QModelIndex idx=sortModel_->mapToSource(index);
+
+    if(idx.isValid())
+    {
+        Zombie z=model_->indexToZombie(idx);
+        std::string p=z.path_to_task();
+        if(!p.empty())
+        {
+            VInfo_ptr ni=VInfo::createFromPath(info_->server(),p);
+            if(ni)
+            {
+                InfoPanelItem::linkSelected(ni);
+            }
+        }
+    }
+}
+
+
+void ZombieItemWidget::slotDoubleClicked(const QModelIndex &index)
+{
+    lookup(index);
+}
+
 void ZombieItemWidget::slotItemSelected(QModelIndex,QModelIndex)
 {
 	checkActionState();
diff --git a/Viewer/src/ZombieItemWidget.hpp b/Viewer/src/ZombieItemWidget.hpp
index 5090d89..621b1c3 100644
--- a/Viewer/src/ZombieItemWidget.hpp
+++ b/Viewer/src/ZombieItemWidget.hpp
@@ -47,7 +47,9 @@ protected Q_SLOTS:
 	void on_actionDelete_triggered();
     void on_actionKill_triggered();
 	void on_reloadTb__clicked(bool);
-	void slotItemSelected(QModelIndex,QModelIndex);
+    void on_actionLookup_triggered();
+    void slotDoubleClicked(const QModelIndex &index);
+    void slotItemSelected(QModelIndex,QModelIndex);
 
 protected:
     void updateState(const ChangeFlags&);
@@ -55,7 +57,8 @@ protected:
 
 private:
 	void command(const std::string& cmdName);
-	void updateContents();
+    void lookup(const QModelIndex& idx);
+    void updateContents();
 	void checkActionState();
 
 	ZombieModel *model_;
diff --git a/Viewer/src/ZombieItemWidget.ui b/Viewer/src/ZombieItemWidget.ui
index 416da5f..75d1649 100644
--- a/Viewer/src/ZombieItemWidget.ui
+++ b/Viewer/src/ZombieItemWidget.ui
@@ -26,7 +26,16 @@
    <property name="spacing">
     <number>1</number>
    </property>
-   <property name="margin">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
     <number>0</number>
    </property>
    <item>
@@ -194,7 +203,7 @@
      <normaloff>:/viewer/terminate.svg</normaloff>:/viewer/terminate.svg</iconset>
    </property>
    <property name="text">
-    <string>Terminate</string>
+    <string>&Terminate</string>
    </property>
   </action>
   <action name="actionRescue">
@@ -203,12 +212,12 @@
      <normaloff>:/viewer/rescue.svg</normaloff>:/viewer/rescue.svg</iconset>
    </property>
    <property name="text">
-    <string>Rescue</string>
+    <string>&Rescue</string>
    </property>
   </action>
   <action name="actionFoboff">
    <property name="text">
-    <string>Fob off</string>
+    <string>&Fob off</string>
    </property>
   </action>
   <action name="actionDelete">
@@ -217,12 +226,20 @@
      <normaloff>:/viewer/close.svg</normaloff>:/viewer/close.svg</iconset>
    </property>
    <property name="text">
-    <string>Delete</string>
+    <string>&Delete</string>
    </property>
   </action>
   <action name="actionKill">
    <property name="text">
-    <string>Kill</string>
+    <string>&Kill</string>
+   </property>
+  </action>
+  <action name="actionLookup">
+   <property name="text">
+    <string>&Look up node in tree</string>
+   </property>
+   <property name="toolTip">
+    <string>Look up node in tree</string>
    </property>
   </action>
  </widget>
@@ -230,7 +247,7 @@
   <customwidget>
    <class>TreeView</class>
    <extends>QTreeView</extends>
-   <header>TreeView.hpp</header>
+   <header location="global">TreeView.hpp</header>
   </customwidget>
  </customwidgets>
  <resources>
diff --git a/Viewer/src/ZombieModel.cpp b/Viewer/src/ZombieModel.cpp
index 94dfd3f..8158857 100644
--- a/Viewer/src/ZombieModel.cpp
+++ b/Viewer/src/ZombieModel.cpp
@@ -122,7 +122,7 @@ QVariant ZombieModel::data( const QModelIndex& index, int role ) const
 	}
 
 	int row=index.row();
-	if(row < 0 || row >= data_.size())
+    if(row < 0 || row >= static_cast<int>(data_.size()))
 		return QVariant();
 
 	QString id=columns_->id(index.column());
@@ -201,7 +201,7 @@ Zombie ZombieModel::indexToZombie(const QModelIndex& idx) const
     if(idx.isValid() && hasData())
     {
         int row=idx.row();
-        if(row >= 0 || row < data_.size())
+        if(row >= 0 || row < static_cast<int>(data_.size()))
             return data_[row];
     }
     return Zombie();
diff --git a/Viewer/src/viewer.qrc b/Viewer/src/viewer.qrc
index 00f3433..2bfa30c 100644
--- a/Viewer/src/viewer.qrc
+++ b/Viewer/src/viewer.qrc
@@ -35,11 +35,15 @@
     <file alias="clear_left.svg">../images/clear_left.svg</file>
     <file alias="case_sensitive.svg">../images/case_sensitive.svg</file>
     <file alias="cogwheel.svg">../images/cogwheel.svg</file>
+    <file alias="cogwheel_blue.svg">../images/cogwheel_blue.svg</file>
     <file alias="colour.svg">../images/colour.svg</file>
+    <file alias="dependency.svg">../images/dependency.svg</file>
+    <file alias="dependency_detail.svg">../images/dependency_detail.svg</file>
     <file alias="directory_arrow.svg">../images/directory_arrow.svg</file>
     <file alias="dock_chain_closed.svg">../images/dock_chain_closed.svg</file>
     <file alias="dock_chain_open.svg">../images/dock_chain_open.svg</file>
     <file alias="dock_config.svg">../images/dock_config.svg</file>
+    <file alias="dock_dependency.svg">../images/dock_dependency.svg</file>
     <file alias="dock_max.svg">../images/dock_max.svg</file>
     <file alias="dock_max_disabled.svg">../images/dock_max_disabled.svg</file>
     <file alias="dock_menu_indicator.png">../images/dock_menu_indicator.png</file>
@@ -50,6 +54,7 @@
     <file alias="editcopy.svg">../images/editcopy.svg</file>
     <file alias="editpaste.svg">../images/editpaste.svg</file>
     <file alias="error.svg">../images/error.svg</file>
+    <file alias="expression.svg">../images/expression.svg</file>
     <file alias="favourite.svg">../images/favourite.svg</file>
     <file alias="favourite_empty.svg">../images/favourite_empty.svg</file>
     <file alias="filesave.svg">../images/filesave.svg</file>
@@ -72,6 +77,7 @@
     <file alias="logo_small.png">../images/logo_small.png</file>
     <file alias="manage_server.svg">../images/manage_server.svg</file>
     <file alias="manual.svg">../images/manual.svg</file>
+    <file alias="menu.svg">../images/menu.svg</file>
     <file alias="menu_arrow_down.svg">../images/menu_arrow_down.svg</file>
     <file alias="node_log.svg">../images/node_log.svg</file>
     <file alias="notification.svg">../images/notification.svg</file>
@@ -79,6 +85,7 @@
     <file alias="padlock.svg">../images/padlock.svg</file>
     <file alias="path_arrow.svg">../images/path_arrow.svg</file>
     <file alias="reload.svg">../images/reload.svg</file>
+    <file alias="reload_green.svg">../images/reload_green.svg</file>
     <file alias="reload_one.svg">../images/reload_one.svg</file>
     <file alias="remove.svg">../images/remove.svg</file>
     <file alias="rescue.svg">../images/rescue.svg</file>
@@ -99,10 +106,9 @@
     <file alias="sync_black.svg">../images/sync_black.svg</file>
     <file alias="terminate.svg">../images/terminate.svg</file>
     <file alias="tip.svg">../images/tip.svg</file>
-    <file alias="tree_branch_end.png">../images/tree_branch_end.png</file>
-    <file alias="tree_branch_more.png">../images/tree_branch_more.png</file>
-    <file alias="tree_vline.png">../images/tree_vline.png</file>
-    <file alias="trigger.svg">../images/trigger.svg</file>
+    <file alias="trigger.svg">../images/trigger.svg</file>   
+    <file alias="trigger_left_arrow.svg">../images/trigger_left_arrow.svg</file>
+    <file alias="trigger_right_arrow.svg">../images/trigger_right_arrow.svg</file>
     <file alias="unknown.svg">../images/unknown.svg</file>
     <file alias="unselect_all.svg">../images/unselect_all.svg</file>
     <file alias="variable.svg">../images/variable.svg</file>
diff --git a/bin/ecbuild b/bin/ecbuild
deleted file mode 100755
index da2d7b9..0000000
--- a/bin/ecbuild
+++ /dev/null
@@ -1,438 +0,0 @@
-#!/bin/bash
-
-set -eua
-
-CMAKE_MIN_REQUIRED=2.8.11
-CMAKE_BUILD_VERSION=3.5.2
-
-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":
-
-    --cmakebin=<path>
-          Set which cmake binary to use. Default is 'cmake'
-
-    --prefix=<prefix>
-          Set the install path to <prefix>.
-          Equivalent to cmake argument "-DCMAKE_INSTALL_PREFIX=<prefix>"
-
-    --build=<build-type>
-          Set the build-type to <build-type>.
-          Equivalent to cmake argument "-DCMAKE_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
-
-    --log=<log-level>
-          Set the ecbuild log-level
-          Equivalent to "-DECBUILD_LOG_LEVEL=<log-level>"
-          <log-level> can be any of:
-             - DEBUG
-             - INFO
-             - WARN
-             - ERROR
-             - CRITICAL
-             - OFF
-          Every choice outputs also the log-levels listed below itself
-
-    --static
-          Build static libraries.
-          Equivalent to "-DBUILD_SHARED_LIBS=OFF"
-
-    --dynamic, --shared
-          Build dynamic libraries (usually the default).
-          Equivalent to "-DBUILD_SHARED_LIBS=ON"
-
-    --config=<config>
-          Configuration file using CMake syntax that gets included
-          Equivalent to cmake argument "-DECBUILD_CONFIG=<config-file>"
-
-    --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 "-DCMAKE_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.
-
-    --build-cmake[=<prefix>]
-          Automatically download and build CMake version $CMAKE_BUILD_VERSION.
-          Requires an internet connection and may take a while. If no prefix
-          is given, install into $PWD.
-
-    --dryrun
-          Don't actually execute the cmake call, just print what would have
-          been executed.
-
-
-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:  -DENABLE_TESTS=ON  -DENABLE_MPI=OFF  -DECKIT_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 -DENABLE_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
-       "-DCMAKE_INSTALL_PREFIX=PREFIX"
-    > make install
-
-------------------------------------------------------------------------
-ECMWF"
-
-EOF
-    exit $1
-}
-
-INSTALL_DIR="$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd -P )"
-ECBUILD_MODULE_PATH=""
-# If there is a directory share/ecbuild/cmake relative to the parent directory
-# (as in an install tree), add it to CMAKE_MODULE_PATH
-if [ -d $INSTALL_DIR/../share/ecbuild/cmake ]; then
-  ECBUILD_MODULE_PATH="$( cd "$INSTALL_DIR/../share/ecbuild/cmake" && pwd -P )"
-# If there is a cmake subdirectory relative to the script directory (as in a
-# tarball), add it to CMAKE_MODULE_PATH
-elif [ -d $INSTALL_DIR/../cmake ]; then
-  ECBUILD_MODULE_PATH="$( cd "$INSTALL_DIR/../cmake" && pwd -P )"
-fi
-
-# Fail if we couldn't find ecBuild modules
-if [ ! -f "$ECBUILD_MODULE_PATH/VERSION.cmake" ]; then
-  echo "FATAL: ecBuild modules could not be found in either $INSTALL_DIR/../share/ecbuild/cmake or $INSTALL_DIR/../cmake" >&2
-  exit 1
-fi
-
-ADD_ECBUILD_OPTIONS="-DCMAKE_MODULE_PATH=$ECBUILD_MODULE_PATH"
-
-if [ -d $INSTALL_DIR/../share/ecbuild/toolchains ]; then
-  ECBUILD_TOOLCHAIN_DIR="$( cd "$INSTALL_DIR/../share/ecbuild/toolchains" && pwd -P )"
-elif [ -d $INSTALL_DIR/share/ecbuild/toolchains ]; then
-  ECBUILD_TOOLCHAIN_DIR="$( cd "$INSTALL_DIR/share/ecbuild/toolchains" && pwd -P )"
-fi
-
-version()
-{
-  ecbuild_version=$(cat ${ECBUILD_MODULE_PATH}/VERSION.cmake | grep ECBUILD_VERSION_STR |  perl -p -e 's/.*([\d]\.[\d]\.[\d]).*/\1/' )
-  echo "ecbuild version ${ecbuild_version}"
-  command -v cmake >/dev/null 2>&1 || { exit 0; }
-  cmake --version | head -1
-  exit 0
-}
-
-log()
-{
-  log_level=$(tr "[a-z]" "[A-Z]" <<< "$1")
-  ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DECBUILD_LOG_LEVEL=${log_level}"
-}
-
-toolchains()
-{
-  if [ -d $ECBUILD_TOOLCHAIN_DIR ]; then
-    cd $ECBUILD_TOOLCHAIN_DIR
-    echo "Available toolchains:"
-    ls | while read fname
-    do
-        echo "  - ${fname%%.*}"
-    done
-    exit 0
-  else
-    echo "No toolchains available."
-    exit 1
-  fi
-}
-
-prefix()
-{
-  ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DCMAKE_INSTALL_PREFIX=${1/#\~\//$HOME/}"
-}
-
-config()
-{
-  arg=${1/#\~\//$HOME/}
-  if [ -f $arg ]; then
-    config_file=$arg
-    config_file="$( cd $( dirname "${config_file}" ) && pwd -P )/$( basename ${config_file} )"
-  else
-    echo "Error:"
-    echo "   Config file [$arg] is not found or is not a file."
-    exit 1
-  fi
-  ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DECBUILD_CONFIG=${config_file}"
-}
-
-toolchain()
-{
-  arg=${1/#\~\//$HOME/}
-  if [ -f $arg ]; then
-    toolchain_file=$arg
-  else
-    if [ -f $ECBUILD_TOOLCHAIN_DIR/$arg.cmake ]; then
-      toolchain_file=$ECBUILD_TOOLCHAIN_DIR/$arg.cmake
-    fi
-  fi
-  if [ -z ${toolchain_file+x} ]; then
-    echo "Error:"
-    echo "   Toolchain [$arg] is not valid: [$arg.cmake] cannot be"
-    echo "   found in [$ECBUILD_TOOLCHAIN_DIR]"
-    exit 1
-  else
-    ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DCMAKE_TOOLCHAIN_FILE=${toolchain_file}"
-  fi
-}
-
-cache()
-{
-  arg=$1
-  if [ -f $arg ]; then
-    cache_file=$arg
-    cache_file="$( cd $( dirname "${cache_file}" ) && pwd -P )/$( basename ${cache_file} )"
-  else
-    echo "Error:"
-    echo "   Cache file [$arg] is not found or is not a file."
-    exit 1
-  fi
-  ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DECBUILD_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"
-
-    opt=""
-    val=""
-
-    case "$1" in
-    --*=*)
-      opt=`echo "$1" | sed 's/=.*//'`
-      val=`echo "$1" | sed 's/--[_a-zA-Z0-9-]*=//'`
-      ;;
-    --*)
-      opt=$1
-      ;;
-    # -D*)
-    #   ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS $1"
-    #   ;;
-    *)
-      break
-      ;;
-    esac
-
-    # echo "debug opt: $opt $val"
-
-    # Parse options
-    case "$opt" in
-      --help)
-        help 0
-  	    ;;
-      --version)
-        version
-        ;;
-      --dryrun)
-        dryrun="yes"
-        ;;
-      --toolchains)
-        toolchains
-        ;;
-      --cmakebin)
-        cmakebin="$val"
-        ;;
-      --prefix)
-        prefix "$val"
-        ;;
-      --build)
-        ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DCMAKE_BUILD_TYPE=$val"
-        ;;
-      --log)
-        log $val
-        ;;
-      --static)
-        ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DBUILD_SHARED_LIBS=OFF"
-        ;;
-      --dynamic)
-        ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DBUILD_SHARED_LIBS=ON"
-        ;;
-      --shared)
-        ADD_ECBUILD_OPTIONS="$ADD_ECBUILD_OPTIONS -DBUILD_SHARED_LIBS=ON"
-        ;;
-      --toolchain)
-        toolchain $val
-        ;;
-      --config)
-        config $val
-        ;;
-      --cache)
-        cache $val
-        ;;
-      --build-cmake)
-        build_cmake="yes"
-        if [[ -n $val ]]; then
-          cmake_prefix="$val"
-        fi
-        ;;
-      --)
-        shift
-        break
-        ;;
-      *)
-        echo "unknown option: $opt"
-	      usage 1
-        ;;
-    esac
-    shift
-done
-
-# If no arguments remain, set srcARG to "."
-if [ $# -eq 0 ]; then
-  srcARG="."
-fi
-
-src=${srcARG:=""}
-cmake=${cmakebin:=cmake}
-dryrun=${dryrun:=no}
-build_cmake=${build_cmake:=""}
-cmake_prefix=${cmake_prefix:=$PWD}
-cmake_found=""
-cmake_version_sufficient=""
-
-
-# Check that version $1 satisfies $2
-# CMake versions have no more than 4 fields
-# Version sort (sort -V) is not available on all platforms
-version_gte() {
-  [ "$2" = "$(echo -e "$1\n$2" | sort -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4 -g | head -n1)" ]
-}
-
-# Use already built CMake if any
-if [[ -x "${cmake_prefix}/bin/cmake" ]]; then
-  echo "Using already built CMake in ${cmake_prefix}/bin/cmake" >&2
-  cmake="${cmake_prefix}/bin/cmake"
-# Build CMake if requested and no sufficient version found
-elif [[ $build_cmake ]]; then
-  echo "Building CMake version ${CMAKE_BUILD_VERSION} and installing into ${cmake_prefix} ..." >&2
-  tarball=cmake-${CMAKE_BUILD_VERSION}.tar.gz
-  if [[ ! -r $tarball ]]; then
-    url=http://www.cmake.org/files/v${CMAKE_BUILD_VERSION:0:3}/$tarball
-    # -N          Download only if the remote version of the file is newer
-    # --continue  Continue an interrupted download
-    # -T 60       Time out a download attempt after 60 seconds
-    # -t 3        Only make 3 download attempts
-    wget -N --continue -T 60 -t 3 $url || {
-      echo "Failed to download CMake release $CMAKE_BUILD_VERSION." >&2
-      echo "Please download from $url" >&2
-      echo "and place $tarball in $PWD" >&2
-      exit 1
-    }
-  fi
-  tar xzf cmake-${CMAKE_BUILD_VERSION}.tar.gz
-  (
-    mkdir -p build_cmake
-    cd build_cmake
-    ../cmake-${CMAKE_BUILD_VERSION}/bootstrap --prefix="${cmake_prefix}" && make && make install
-  )
-  cmake="${cmake_prefix}/bin/cmake"
-fi
-
-# Check if the cmake version is sufficient
-if $(command -v $cmake >/dev/null 2>&1); then
-  cmake_found="yes"
-  cmake_version=$($cmake --version | head -n1 | awk '{ print $3 }')
-  echo "Found CMake version $cmake_version" >& 2
-  if version_gte $cmake_version $CMAKE_MIN_REQUIRED; then
-    cmake_version_sufficient="yes"
-  fi
-fi
-
-# Fail if we don't have a sufficient CMake
-if [[ ! $cmake_version_sufficient ]]; then
-  if [[ ! $cmake_found ]]; then
-    echo "CMake is required and cannot be found in the PATH." >&2
-  else
-    echo "CMake version $CMAKE_MIN_REQUIRED is required but only $cmake_version was found." >&2
-  fi
-  echo "" >&2
-  echo "  Try 'module load cmake', specify a CMake binary with --cmakebin=/path/to/cmake" >&2
-  echo "  or  let ecbuild download and build CMake with the --build-cmake option." >&2
-  exit 1
-fi
-
-echo ""
-echo "$cmake ${ADD_ECBUILD_OPTIONS} $@ $src"
-echo ""
-
-if [ ${dryrun} == "yes" ]; then
-  echo "[DRYRUN] -- not executing"
-  exit 0
-fi
-
-$cmake ${ADD_ECBUILD_OPTIONS} "$@" $src
diff --git a/build_scripts/.pydevproject b/build_scripts/.pydevproject
deleted file mode 100644
index a9cca03..0000000
--- a/build_scripts/.pydevproject
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?eclipse-pydev version="1.0"?>
-
-<pydev_project>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
-</pydev_project>
diff --git a/build_scripts/boost_build.sh b/build_scripts/boost_build.sh
index 223e51d..2c1b270 100755
--- a/build_scripts/boost_build.sh
+++ b/build_scripts/boost_build.sh
@@ -90,10 +90,8 @@ if test_uname Linux ; then
             # for boost 1.53 and > gcc 4.3 -Wno-unused-local-typedefs  : not valid
             # for boost 1.53 and > gcc 4.8 -Wno-unused-local-typedefs  : get a lot warning messages , suppress
             # for boost 1.53 and > gcc 6.1 -Wno-deprecated-declarations: std::auto_ptr deprecated messages, suppress
-            compiler=$(gcc -dumpversion)
-            if [ $compiler = "4.3" ] ; then
-                CXXFLAGS=-d2    #  dummy argument, since CXXFLAGS is quoted
-            else 
+            compiler=$(gcc -dumpversion | sed 's/\.//g' )  # assume major.minor.patch
+            if [ "$compiler" -gt 430  ] ; then
                 CXXFLAGS=cxxflags=-Wno-unused-local-typedefs
                 #CXXFLAGS="cxxflags=-Wno-unused-local-typedefs,-Wno-deprecated-declarations"
        		fi
@@ -182,10 +180,56 @@ else
    #
    # 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)
    #
+   
+    # ===============================================================================
+    # Error to watch out for:
+    # 1/ 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
+    # 2/ pyconfig.h cant find include file:
+    #
+    # Note: ./bootstrap.sh will create a project-config.jam
+    #
+    # For both errors: 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'.  Typically we remove $HOME/user-config.jam is using python is defined in it.
+    # for 2/ use    
+    #    export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:/usr/local/apps/python/2.7.12-01/include/python2.7/"
+    # *ONLY* if first soultion fails ???
+    # 
+    #
+    # 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
+    #
+    # ==========================================================================================
+    # PYTHON3:
+    # Build:
+    #   1/ module load python3, this update the $PATH
+    #   2/ ./bootstrap.sh --with-python=/usr/local/apps/python3/3.5.1-01/bin/python3
+    #   3/ Need to manually edit $BOOST_ROOT/project-config.jam,  make sure file '$BOOST_ROOT/project-config.jam' has:
+    #
+    #      using python 
+    #       : 3.5 
+    #       : /usr/local/apps/python3/3.5.1-01/bin/python3  # ***** If this is left as python3, includes get messed up, have mix of python2 & 3
+    #       : /usr/local/apps/python3/3.5.1-01/include/python3.5m # include directory
+    #       ; 
+    #       ...
+    #      option.set includedir : /usr/local/apps/python3/3.5.1-01/include/python3.5m ;  # ***MAKE*** sure this is set
+    #
+    #     ***** cmd/prefix must be path to python3, otherwise compilation include files has a mixture of
+    #     python 2.7 and 3.5, YUK, took ages to debug
+    #
+    # Check:
+    #   To check the build make sure we don't have symbol pulled in from python2 libs
+    #   cd $BOOST_ROOT/stage/lib
+    #   nm -D *python* | grep PyClass_Type                                                # PyClass_Type is a symbol *ONLY* used in python2.x
+    #   nm -D /tmp/ma0/workspace/bdir/release/ecflow/Pyext/ecflow.so | grep PyClass_Type  # check ecflow.so
+    # ===============================================================================
+               
    ./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/build_scripts/clean.sh b/build_scripts/clean.sh
index 25b8ed2..f2c6543 100755
--- a/build_scripts/clean.sh
+++ b/build_scripts/clean.sh
@@ -13,7 +13,7 @@ cd $WK
 rm -rf ACore/bin
 rm -rf ANattr/bin
 rm -rf ANode/bin 
-rm -rf AParser/bin 
+rm -rf ANode/parser/bin 
 rm -rf Base/bin
 rm -rf CSim/bin
 rm -rf Client/bin 
@@ -28,7 +28,8 @@ 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 ANode/parser/test/data/single_defs/mega.def_log
+rm -rf Pyext/test/data/CUSTOMER
 rm -rf Pyext/test.def
 rm -rf Pyext/build
 rm -rf Pyext/timestamp
diff --git a/build_scripts/massif.sh b/build_scripts/massif.sh
index 2c620f3..7cd725f 100755
--- a/build_scripts/massif.sh
+++ b/build_scripts/massif.sh
@@ -23,11 +23,11 @@ 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 ANode/parser/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
+#valgrind --tool=massif ANode/parser/bin/$compiler/$mode/perf_aparser
 
diff --git a/build_scripts/profile.sh b/build_scripts/profile.sh
index b440555..d56efc6 100755
--- a/build_scripts/profile.sh
+++ b/build_scripts/profile.sh
@@ -18,42 +18,42 @@ compiler=gcc-$(gcc -dumpversion)
 echo "gprof: variant=profile compiler=$compiler"
 
 #
-cd ACore
+cd $WK/ACore
 bin/$compiler/profile/u_acore
 gprof bin/$compiler/profile/u_acore   gmon.out   >   gprof.out
 
-cd ../ANattr
+cd $WK/ANattr
 bin/$compiler/profile/u_anattr
 gprof bin/$compiler/profile/u_anattr gmon.out   >   gprof.out
 
-cd ../ANode
+cd $WK/ANode
 bin/$compiler/profile/u_anode
 gprof bin/$compiler/profile/u_anode gmon.out   >   gprof.out
 
-cd ../AParser
+cd $WK/ANode/parser
 bin/$compiler/profile/u_aparser
 gprof bin/$compiler/profile/u_aparser gmon.out   >   gprof.out
 
-cd ../Base
+cd $WK/Base
 bin/$compiler/profile/u_base
 gprof bin/$compiler/profile/u_base gmon.out   >   gprof.out
 
-cd ../Client
+cd $WK/Client
 bin/$compiler/profile/s_client
 gprof bin/$compiler/profile/s_client gmon.out   >   gprof.out
 
-cd ../Server
+cd $WK/Server
 bin/$compiler/profile/u_server
 gprof bin/$compiler/profile/u_server gmon.out   >   gprof.out
 
-cd ../Test
+cd $WK/Test
 bin/$compiler/profile/test
 gprof bin/$compiler/profile/test gmon.out   >   gprof.out
 
-cd ../Simulator
+cd $WK/CSim
 bin/$compiler/profile/c_csim
 gprof bin/$compiler/profile/c_csim gmon.out   >   gprof.out
 
-cd ../AParser
+cd $WK/ANode/parser
 bin/$compiler/profile/perf_aparser
 gprof bin/$compiler/profile/perf_aparser gmon.out   >   gprof.out
diff --git a/build_scripts/rmbin.sh b/build_scripts/rmbin.sh
index 496b024..30677ad 100755
--- a/build_scripts/rmbin.sh
+++ b/build_scripts/rmbin.sh
@@ -12,7 +12,7 @@ cd $WK
 rm -rf ACore/bin
 rm -rf ANattr/bin
 rm -rf ANode/bin 
-rm -rf AParser/bin 
+rm -rf ANode/parser/bin 
 rm -rf Base/bin
 rm -rf CSim/bin
 rm -rf Client/bin 
@@ -20,4 +20,4 @@ rm -rf Server/bin
 rm -rf Test/bin
 rm -rf Pyext/bin 
 rm -rf view/bin 
-   
+   
\ No newline at end of file
diff --git a/build_scripts/tar_ecflow.sh b/build_scripts/tar_ecflow.sh
index 9257c17..b24fec4 100755
--- a/build_scripts/tar_ecflow.sh
+++ b/build_scripts/tar_ecflow.sh
@@ -28,7 +28,7 @@ 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 ANode/parser/test/data/single_defs/mega.def_log
 rm -rf Pyext/test.def
 rm -rf Pyext/build
 rm -rf Pyext/test/data/ecf_home_*
diff --git a/build_scripts/test.sh b/build_scripts/test.sh
index af66724..20c8818 100755
--- a/build_scripts/test.sh
+++ b/build_scripts/test.sh
@@ -114,9 +114,9 @@ if test_uname Linux ; then
    ACore/bin/$exe_path/u_acore      --log_level=message $TEST_OPTS
    ANattr/bin/$exe_path/u_anattr    --log_level=message $TEST_OPTS
    ANode/bin/$exe_path/u_anode      --log_level=message $TEST_OPTS
-   AParser/bin/$exe_path/u_aparser  --log_level=message $TEST_OPTS
+   ANode/parser/bin/$exe_path/u_aparser  --log_level=message $TEST_OPTS
    if [ "$safe" = no ] ; then
-      AParser/bin/$exe_path/perf_aparser --log_level=message $TEST_OPTS
+      ANode/parser/bin/$exe_path/perf_aparser --log_level=message $TEST_OPTS
    fi
    Base/bin/$exe_path/u_base         --log_level=message $TEST_OPTS
    
@@ -147,9 +147,9 @@ elif test_uname HP-UX ; then
    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
+   ANode/parser/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
+      ANode/parser/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
    if [ "$safe" = no ] ; then
@@ -174,9 +174,9 @@ elif test_uname AIX ; then
    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
+   ANode/parser/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
+      ANode/parser/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
    if [ "$safe" = no ] ; then
diff --git a/build_scripts/val.sh b/build_scripts/val.sh
index ff65874..99964a7 100755
--- a/build_scripts/val.sh
+++ b/build_scripts/val.sh
@@ -44,7 +44,7 @@ echo "valgrind: variant=$mode compiler=$compiler"
 valgrind --num-callers=24 --leak-check=full --show-reachable=yes --error-exitcode=1 --partial-loads-ok=yes ACore/bin/$compiler/$mode/u_acore
 valgrind --num-callers=24 --leak-check=full --show-reachable=yes --error-exitcode=1 --partial-loads-ok=yes ANattr/bin/$compiler/$mode/u_anattr
 valgrind --num-callers=24 --leak-check=full --show-reachable=yes --error-exitcode=1 --partial-loads-ok=yes ANode/bin/$compiler/$mode/u_anode
-valgrind --num-callers=24 --leak-check=full --show-reachable=yes --error-exitcode=1 --partial-loads-ok=yes AParser/bin/$compiler/$mode/u_aparser
+valgrind --num-callers=24 --leak-check=full --show-reachable=yes --error-exitcode=1 --partial-loads-ok=yes ANode/parser/bin/$compiler/$mode/u_aparser
 valgrind --num-callers=24 --leak-check=full --show-reachable=yes --error-exitcode=1 --partial-loads-ok=yes Base/bin/$compiler/$mode/u_base
 valgrind --num-callers=24 --leak-check=full --show-reachable=yes --error-exitcode=1 --partial-loads-ok=yes Client/bin/$compiler/$mode/s_client
 valgrind --num-callers=24 --leak-check=full --show-reachable=yes --error-exitcode=1 --partial-loads-ok=yes Server/bin/$compiler/$mode/u_server
diff --git a/cmake.sh b/cmake.sh
index 0a59595..27f46fe 100755
--- a/cmake.sh
+++ b/cmake.sh
@@ -34,7 +34,6 @@ show_error_and_exit() {
    exit 1
 }
 
-install_arg=
 ecbuild_arg=
 copy_tarball_arg=
 package_source_arg=
@@ -77,7 +76,6 @@ while [[ "$#" != 0 ]] ; do
    elif [[ "$1" = ssl ]]   ; then ssl_arg=$1 ;
    elif [[ "$1" = secure_user ]]   ; then secure_user_arg=$1 ;
    elif [[ "$1" = ecbuild ]] ; then ecbuild_arg=$1 ;
-   elif [[ "$1" = install ]] ; then install_arg=$1 ;
    elif [[ "$1" = log ]]   ; then log_arg=$1 ;
    elif [[ "$1" = clang ]] ; then clang_arg=$1 ;
    elif [[ "$1" = intel ]] ; then intel_arg=$1 ;
@@ -131,7 +129,7 @@ CXX_FLAGS="-Wno-unused-local-typedefs -Wno-unused-variable"
 # To load module automatically requires Korn shell, system start scripts
 
 module load cmake/3.3.2
-module load ecbuild/2.6.0
+module load ecbuild/2.7.3
 
 cmake_extra_options=""
 if [[ "$clang_arg" = clang ]] ; then
@@ -208,7 +206,7 @@ cd ../bdir/$mode_arg/ecflow
 # =============================================================================================
 # ctest
 #
-if [[ $test_arg = test || $test_safe_arg = test_safe ]] ; then
+if [[ $test_safe_arg = test_safe ]] ; then
 	ctest -R ^u_
 	ctest -R c_
 	ctest -R py_u
@@ -217,11 +215,6 @@ if [[ $test_arg = test || $test_safe_arg = test_safe ]] ; then
 	   exit 0
 	fi
 fi
-if [[ $test_arg = test ]] ; then
-	ctest -R s_test
-	ctest -R py_s
-	exit 0
-fi
 if [[ "$ctest_arg" != "" ]] ; then
 	$ctest_arg
 	exit 0
@@ -256,7 +249,12 @@ fi
 
 gui_options=
 if [[ $no_gui_arg = no_gui ]] ; then
-    gui_options="-DENABLE_GUI=OFF -DENABLE_UI=OFF -DENABLE_ALL_TESTS=ON"
+    gui_options="-DENABLE_GUI=OFF -DENABLE_UI=OFF"
+fi
+
+test_options=
+if [[ $test_arg = test ]] ; then
+   test_options="-DENABLE_ALL_TESTS=ON"
 fi
 
 if [[ $package_source_arg = package_source ]] ; then
@@ -265,9 +263,6 @@ if [[ $package_source_arg = package_source ]] ; then
 fi
 
 install_prefix=/var/tmp/$USER/install/cmake/ecflow/$release.$major.$minor
-if [[ $install_arg = install ]] ; then
-    install_prefix=/usr/local/apps/ecflow/$release.$major.$minor
-fi
 
 ecbuild=ecbuild
 if [[ $ecbuild_arg = ecbuild ]] ; then
@@ -279,25 +274,41 @@ $ecbuild $source_dir \
             -DCMAKE_INSTALL_PREFIX=$install_prefix  \
             -DENABLE_WARNINGS=ON \
             -DCMAKE_CXX_FLAGS="$CXX_FLAGS" \
-            -DCMAKE_PYTHON_INSTALL_TYPE=local \
-            -DCMAKE_PREFIX_PATH="/usr/local/apps/qt/5.5.0/5.5/gcc_64/" \
-            -DENABLE_STATIC_BOOST_LIBS=ON \
             ${cmake_extra_options} \
             ${gui_options} \
             ${ssl_options} \
             ${secure_user_options} \
-            ${log_options}
-            #-DENABLE_ALL_TESTS=ON
-            #-DENABLE_GUI=ON       -DENABLE_UI=ON                    
-            #-DENABLE_SERVER=OFF \
-            #-DCMAKE_PYTHON_INSTALL_PREFIX=/var/tmp/$USER/install/python/ecflow/$release.$major.$minor 
-            #-DENABLE_PROFILING=ON 
-            #-DECBUILD_GPROF_FLAGS
+            ${log_options} \
+            ${test_options}
+            
+            #-DENABLE_STATIC_BOOST_LIBS=ON \
+            #-DCMAKE_PYTHON_INSTALL_TYPE=local \
+            #-DENABLE_PYTHON=OFF   \
+            #-DCMAKE_PYTHON_INSTALL_PREFIX=/var/tmp/$USER/install/python/ecflow/$release.$major.$minor  \
+            #-DCMAKE_PREFIX_PATH="/usr/local/apps/qt/5.5.0/5.5/gcc_64/" \
+            #-DENABLE_GUI=ON       \
+            #-DENABLE_UI=ON        \           
+            #-DENABLE_ALL_TESTS=ON \
+            #-DENABLE_SERVER=OFF   \
+            #-DENABLE_PROFILING=ON \
+            #-DECBUILD_GPROF_FLAGS \
         
 # =============================================================================================
 if [[ "$make_arg" != "" ]] ; then
 	$make_arg 
 	# $make_arg VERBOSE=1
+	
+    # generate the server file locally, and install it. Otherwise list of server will not be complete set
+	if [[ "$make_arg" == "make install" ]] ; then
+		if [[ -f /home/ma/emos/bin/ecflow_site_server_install.sh ]] ; then
+
+   			/home/ma/emos/bin/ecflow_site_server_install.sh -g
+
+    		if [[ -f servers ]] ; then
+        		mv servers $install_prefix/share/ecflow/.
+            fi
+		fi
+	fi
 	exit 0
 fi
 
@@ -325,8 +336,9 @@ fi
 # ============================================================================================
 # 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
+#    default: local
+#    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
diff --git a/cmake/FindAIO.cmake b/cmake/FindAIO.cmake
index 5dd9244..5606529 100644
--- a/cmake/FindAIO.cmake
+++ b/cmake/FindAIO.cmake
@@ -1,8 +1,8 @@
 # (C) Copyright 1996-2017 ECMWF.
-# 
+#
 # This software is licensed under the terms of the Apache Licence Version 2.0
-# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
-# In applying this licence, ECMWF does not waive the privileges and immunities 
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
 # granted to it by virtue of its status as an intergovernmental organisation nor
 # does it submit to any jurisdiction.
 
@@ -32,34 +32,38 @@ 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 )
+		if( NOT DEFINED EC_HAVE_AIOCB )
+			ecbuild_cache_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 )
+		endif()
+
+		if( NOT DEFINED EC_HAVE_AIOCB64 )
+			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 )
+		endif()
 
     cmake_pop_check_state()
 
diff --git a/cmake/FindGd.cmake b/cmake/FindGd.cmake
new file mode 100644
index 0000000..01b2586
--- /dev/null
+++ b/cmake/FindGd.cmake
@@ -0,0 +1,59 @@
+# - Try to find the GD library
+# Once done this will define
+#
+# GD_FOUND - system has GD
+# GD_INCLUDE_DIRS - the GD include directory
+# GD_LIBRARIES - Link these to use GD
+#
+# Define GD_MIN_VERSION for which version desired.
+
+
+if( NOT DEFINED GD_PATH AND NOT "$ENV{GD_PATH}" STREQUAL "" )
+    set( APPEND GD_PATH "$ENV{GD_PATH}" )
+endif()
+
+if( NOT DEFINED GD_PATH )
+
+    include(FindPkgConfig)
+
+    if(GD_FIND_REQUIRED)
+        set(_pkgconfig_REQUIRED "REQUIRED")
+    else()
+        set(_pkgconfig_REQUIRED "")
+    endif()
+
+    if(GD_MIN_VERSION)
+        pkg_check_modules(PKGD ${_pkgconfig_REQUIRED} GD>=${GD_MIN_VERSION})
+    else()
+        pkg_check_modules(PKGD ${_pkgconfig_REQUIRED} GD)
+    endif()
+
+    if( PKG_CONFIG_FOUND AND PKGD_FOUND )
+
+        find_path(GD_INCLUDE_DIR gd.h HINTS ${PKGD_INCLUDEDIR} ${PKGD_INCLUDE_DIRS} PATH_SUFFIXES GD NO_DEFAULT_PATH )
+        find_library(GD_LIBRARY  gd   HINTS ${PKGD_LIBDIR}     ${PKGD_LIBRARY_DIRS} PATH_SUFFIXES GD NO_DEFAULT_PATH )
+
+    endif()
+
+else()
+
+    find_path(GD_INCLUDE_DIR gd.h PATHS ${GD_PATH}/include PATH_SUFFIXES GD NO_DEFAULT_PATH )
+    find_library(GD_LIBRARY  gd   PATHS ${GD_PATH}/lib     PATH_SUFFIXES GD NO_DEFAULT_PATH )
+
+endif()
+
+find_path(GD_INCLUDE_DIR gd.h PATH_SUFFIXES GD )
+find_library( GD_LIBRARY gd   PATH_SUFFIXES GD )
+
+set( GD_LIBRARIES    ${GD_LIBRARY} )
+set( GD_INCLUDE_DIRS ${GD_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+# handle the QUIET and REQUIRED arguments and set GD_FOUND to TRUE
+# if all listed variables are TRUE
+# Note: capitalisation of the package name must be the same as in the file name
+find_package_handle_standard_args(GD  DEFAULT_MSG
+                                  GD_LIBRARY GD_INCLUDE_DIR)
+
+mark_as_advanced( GD_INCLUDE_DIR GD_LIBRARY )
diff --git a/cmake/FindNAG.cmake b/cmake/FindNAG.cmake
new file mode 100644
index 0000000..883a375
--- /dev/null
+++ b/cmake/FindNAG.cmake
@@ -0,0 +1,43 @@
+# (C) Copyright 1996-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not 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 NAG includes and library
+# This module defines
+#
+#  NAG_FOUND         - System has NAG
+#  NAG_INCLUDE_DIRS  - the NAG include directories
+#  NAG_LIBRARIES     - the libraries needed to use NAG
+#
+# The following paths will be searched with priority if set in CMake or env
+#
+#  NAG_DIR   - root folder of the NAG installation
+#  NAG_PATH  - root folder of the NAG installation
+
+find_path( NAG_INCLUDE_DIR nag_library.mod
+           PATHS ${NAG_PATH} ENV NAG_PATH
+                 ${NAG_DIR}  ENV NAG_DIR
+           PATH_SUFFIXES include
+           NO_DEFAULT_PATH )
+
+find_library( NAG_LIBRARY NAMES nag nag_nag
+              PATHS ${NAG_PATH} ENV NAG_PATH
+                    ${NAG_DIR}  ENV NAG_DIR
+              PATH_SUFFIXES lib lib64
+              NO_DEFAULT_PATH )
+
+set( NAG_LIBRARIES    ${NAG_LIBRARY} )
+set( NAG_INCLUDE_DIRS ${NAG_INCLUDE_DIR} )
+
+include(FindPackageHandleStandardArgs)
+
+# handle the QUIETLY and REQUIRED arguments and set NAG_FOUND to TRUE
+# if all listed variables are TRUE
+find_package_handle_standard_args( NAG DEFAULT_MSG
+                                   NAG_LIBRARY NAG_INCLUDE_DIR )
+
+mark_as_advanced( NAG_INCLUDE_DIR NAG_LIBRARY )
diff --git a/cmake/FindPangoCairo.cmake b/cmake/FindPangoCairo.cmake
index cb70737..15e2da4 100644
--- a/cmake/FindPangoCairo.cmake
+++ b/cmake/FindPangoCairo.cmake
@@ -3,8 +3,8 @@
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 # In applying this licence, ECMWF does not waive the privileges and immunities
-# granted to it by virtue of its status as an intergovernmental organisation nor
-# does it submit to any jurisdiction.
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
 
 # - Try to find PangoCairo
 
@@ -40,8 +40,6 @@ else()
 
     # this is to get magics compiling on mac with macbrew
 
-    include(FindPackageHandleStandardArgs)
-
     set(PANGO_VERSION 1.0)
     set(GLIB_VERSION 2.0)
 
@@ -69,7 +67,7 @@ else()
         ${_CAIRO_INCLUDE_DIRS}
         ${_GLIB_INCLUDE_DIRS_1}
         ${_GLIB_INCLUDE_DIRS_2}
-	${X11_INCLUDE_DIR}
+        ${X11_INCLUDE_DIR}
     )
 
     find_library( _PANGOCAIRO_LIBRARIES NAMES pangocairo pangocairo-${PANGO_VERSION})
@@ -82,15 +80,26 @@ else()
         ${_PANGO_LIBRARIES}
         ${_CAIRO_LIBRARIES}
         ${_GLIB_LIBRARIES}
-	${X11_LIBRARIES}
+        ${X11_LIBRARIES}
     )
 
+    include(FindPackageHandleStandardArgs)
+
     # Handle the QUIET and REQUIRED arguments and set PANGOCAIRO_FOUND to TRUE
     # if all listed variables are TRUE
     # Note: capitalisation of the package name must be the same as in file name
     find_package_handle_standard_args( PangoCairo  DEFAULT_MSG
-                                       PANGOCAIRO_LIBRARIES
-                                       PANGOCAIRO_INCLUDE_DIRS  )
+                                       _PANGOCAIRO_INCLUDE_DIRS
+                                       _CAIRO_INCLUDE_DIRS
+                                       _GLIB_INCLUDE_DIRS_1
+                                       _GLIB_INCLUDE_DIRS_2
+                                       X11_INCLUDE_DIR
+                                       _PANGOCAIRO_LIBRARIES
+                                       _PANGO_LIBRARIES
+                                       _CAIRO_LIBRARIES
+                                       _GLIB_LIBRARIES
+                                       X11_LIBRARIES )
 
 endif()
 
+mark_as_advanced( PANGOCAIRO_INCLUDE_DIRS PANGOCAIRO_LIBRARIES )
diff --git a/cmake/VERSION.cmake b/cmake/VERSION.cmake
index ce5f7de..3b36296 100644
--- a/cmake/VERSION.cmake
+++ b/cmake/VERSION.cmake
@@ -1,7 +1,7 @@
 set( ECBUILD_MAJOR_VERSION "2" )
-set( ECBUILD_MINOR_VERSION "6" )
-set( ECBUILD_PATCH_VERSION "0" )
+set( ECBUILD_MINOR_VERSION "7" )
+set( ECBUILD_PATCH_VERSION "3" )
 
-set( ECBUILD_VERSION_STR  "2.6.0" )
+set( ECBUILD_VERSION_STR  "2.7.3" )
 
-set( ECBUILD_MACRO_VERSION "${ECBUILD_MAJOR_VERSION}.${ECBUILD_MINOR_VERSION}" )
+set( ECBUILD_MACRO_VERSION "${ECBUILD_VERSION_STR}" )
diff --git a/cmake/compiler_flags/Clang_C.cmake b/cmake/compiler_flags/Clang_C.cmake
index b742a5b..51cf72b 100644
--- a/cmake/compiler_flags/Clang_C.cmake
+++ b/cmake/compiler_flags/Clang_C.cmake
@@ -8,6 +8,6 @@
 
 set( CMAKE_C_FLAGS_RELEASE        "-O3 -DNDEBUG"   CACHE STRING "C compiler flags for Release builds"          FORCE )
 set( CMAKE_C_FLAGS_BIT            "-O2 -DNDEBUG"   CACHE STRING "C compiler flags for Bit-reproducible builds" FORCE )
-set( CMAKE_C_FLAGS_DEBUG          "-O0 -g -ftrapv" CACHE STRING "C compiler flags for Debug builds"            FORCE )
+set( CMAKE_C_FLAGS_DEBUG          "-O0 -g"         CACHE STRING "C compiler flags for Debug builds"            FORCE )
 set( CMAKE_C_FLAGS_PRODUCTION     "-O3 -g"         CACHE STRING "C compiler flags for Production builds."      FORCE )
 set( CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g"         CACHE STRING "C compiler flags for RelWithDebInfo builds."  FORCE )
diff --git a/cmake/compiler_flags/Clang_CXX.cmake b/cmake/compiler_flags/Clang_CXX.cmake
index 7570630..7f6524e 100644
--- a/cmake/compiler_flags/Clang_CXX.cmake
+++ b/cmake/compiler_flags/Clang_CXX.cmake
@@ -8,6 +8,6 @@
 
 set( CMAKE_CXX_FLAGS_RELEASE        "-O3 -DNDEBUG"   CACHE STRING "C++ compiler flags for Release builds"          FORCE )
 set( CMAKE_CXX_FLAGS_BIT            "-O2 -DNDEBUG"   CACHE STRING "C++ compiler flags for Bit-reproducible builds" FORCE )
-set( CMAKE_CXX_FLAGS_DEBUG          "-O0 -g -ftrapv" CACHE STRING "C++ compiler flags for Debug builds"            FORCE )
+set( CMAKE_CXX_FLAGS_DEBUG          "-O0 -g"         CACHE STRING "C++ compiler flags for Debug builds"            FORCE )
 set( CMAKE_CXX_FLAGS_PRODUCTION     "-O3 -g"         CACHE STRING "C++ compiler flags for Production builds."      FORCE )
 set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g"         CACHE STRING "C++ compiler flags for RelWithDebInfo builds."  FORCE )
diff --git a/cmake/compiler_flags/GNU_Fortran.cmake b/cmake/compiler_flags/GNU_Fortran.cmake
index 6e28844..cd4dbfa 100644
--- a/cmake/compiler_flags/GNU_Fortran.cmake
+++ b/cmake/compiler_flags/GNU_Fortran.cmake
@@ -12,6 +12,8 @@ set( CMAKE_Fortran_FLAGS_DEBUG          "-O0 -g -fcheck=bounds -fbacktrace -fini
 set( CMAKE_Fortran_FLAGS_PRODUCTION     "-O2 -g"                                                                   CACHE STRING "Fortran compiler flags for Production builds."      FORCE )
 set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g"                                                                   CACHE STRING "Fortran compiler flags for RelWithDebInfo builds."  FORCE )
 
+set( Fortran_FLAG_STACK_ARRAYS "-fstack-arrays" )
+
 ####################################################################
 
 # Meaning of flags
diff --git a/cmake/compiler_flags/Intel_Fortran.cmake b/cmake/compiler_flags/Intel_Fortran.cmake
index abd85f8..d6e9719 100644
--- a/cmake/compiler_flags/Intel_Fortran.cmake
+++ b/cmake/compiler_flags/Intel_Fortran.cmake
@@ -6,9 +6,15 @@
 # granted to it by virtue of its status as an intergovernmental organisation
 # nor does it submit to any jurisdiction.
 
-set( CMAKE_Fortran_FLAGS_RELEASE        "-O3 -unroll -inline -heap-arrays"          CACHE STRING "Release Fortran flags"                 FORCE )
-set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g"                                    CACHE STRING "Release-with-debug-info Fortran flags" FORCE )
-set( CMAKE_Fortran_FLAGS_BIT            "-O2 -unroll -inline -heap-arrays"          CACHE STRING "Bit-reproducible Fortran flags"        FORCE )
+set( Fortran_AUTOMATIC_ARRAYS_LIMIT 32768 )  # (32 kb)
+math( EXPR Fortran_AUTOMATIC_ARRAYS_LIMIT_KB "${Fortran_AUTOMATIC_ARRAYS_LIMIT}/1024" )
+
+set( Fortran_FLAG_STACK_ARRAYS     "-no-heap-arrays" )
+set( Fortran_FLAG_AUTOMATIC_ARRAYS "-heap-arrays ${Fortran_AUTOMATIC_ARRAYS_LIMIT_KB}" )
+
+set( CMAKE_Fortran_FLAGS_RELEASE        "-O3 -unroll -inline ${Fortran_FLAG_AUTOMATIC_ARRAYS}"          CACHE STRING "Release Fortran flags"                 FORCE )
+set( CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-O2 -g ${Fortran_FLAG_AUTOMATIC_ARRAYS}"                       CACHE STRING "Release-with-debug-info Fortran flags" FORCE )
+set( CMAKE_Fortran_FLAGS_BIT            "-O2 -unroll -inline ${Fortran_FLAG_AUTOMATIC_ARRAYS}"          CACHE STRING "Bit-reproducible Fortran flags"        FORCE )
 # -check all implies -check bounds
-set( CMAKE_Fortran_FLAGS_DEBUG          "-O0 -g -traceback -heap-arrays -check all" CACHE STRING "Debug Fortran flags"                   FORCE )
-set( CMAKE_Fortran_FLAGS_PRODUCTION     "-O3 -g"                                    CACHE STRING "Production Fortran compiler flags"     FORCE )
+set( CMAKE_Fortran_FLAGS_DEBUG          "-O0 -g -traceback ${Fortran_FLAG_AUTOMATIC_ARRAYS} -check all" CACHE STRING "Debug Fortran flags"                   FORCE )
+set( CMAKE_Fortran_FLAGS_PRODUCTION     "-O3 -g ${Fortran_FLAG_AUTOMATIC_ARRAYS}"                       CACHE STRING "Production Fortran compiler flags"     FORCE )
diff --git a/cmake/contrib/FindNetCDF4.cmake b/cmake/contrib/FindNetCDF4.cmake
index 70e54af..d050f01 100644
--- a/cmake/contrib/FindNetCDF4.cmake
+++ b/cmake/contrib/FindNetCDF4.cmake
@@ -195,15 +195,13 @@ else()
             list( APPEND NETCDF_INCLUDE_DIRS ${NETCDF_${INC}_INCLUDE_DIR} )
           else()
             list( FIND NETCDF_REQUIRED ${INC} location )
-            if( ${location} EQUAL -1 )
-              else()
+            if( ${location} GREATER -1 )
               if(NETCDF_FIND_REQUIRED)
                 ecbuild_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()
diff --git a/cmake/contrib/GreatCMakeCookOff/AddCPP11Flags.cmake b/cmake/contrib/GreatCMakeCookOff/AddCPP11Flags.cmake
index ac7f456..eb17be5 100644
--- a/cmake/contrib/GreatCMakeCookOff/AddCPP11Flags.cmake
+++ b/cmake/contrib/GreatCMakeCookOff/AddCPP11Flags.cmake
@@ -27,24 +27,36 @@ if(CMAKE_VERSION VERSION_LESS 2.8.9)
   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)
-check_cxx_compiler_flag(-hstd=c++11 has_hstd_cpp11)
-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")
-elseif(has_hstd_cpp11)
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -hstd=c++11")
-endif(has_std_gnupp11)
+if( CXX11_FLAG )
+
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX11_FLAG}")
+
+else()
+
+  if(MINGW)
+    LIST( APPEND CHECK_CXX11_FLAGS
+      "-std=gnu++11"
+      "-std=gnu++0x"
+    )
+  endif(MINGW)
+
+  LIST( APPEND CHECK_CXX11_FLAGS
+    "-std=c++11"
+    "-hstd=c++11"
+    "-std=c++0x"
+  )
+
+  set( __N 1 )
+  foreach( _cxx11_flag ${CHECK_CXX11_FLAGS} )
+    check_cxx_compiler_flag( ${_cxx11_flag} has_cxx11_flag_${__N} )
+    if( has_cxx11_flag_${__N} )
+      set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_cxx11_flag}" )
+      break()
+    endif()
+    math( EXPR __N '${__N}+1' )
+  endforeach()
+
+endif()
 
 if(MSVC) 
   set(MSWINDOBE TRUE)
diff --git a/cmake/contrib/GreatCMakeCookOff/CheckCXX11Features.cmake b/cmake/contrib/GreatCMakeCookOff/CheckCXX11Features.cmake
index 593b62f..fafcd23 100644
--- a/cmake/contrib/GreatCMakeCookOff/CheckCXX11Features.cmake
+++ b/cmake/contrib/GreatCMakeCookOff/CheckCXX11Features.cmake
@@ -44,7 +44,7 @@ MACRO(cxx11_check_single_feature FEATURE_NAME FEATURE_NUMBER RESULT_VAR)
         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
+      ecbuild_try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
           "${_bindir}" "${_SRCFILE}")
       IF (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
         SET(${RESULT_VAR} TRUE)
@@ -52,7 +52,7 @@ MACRO(cxx11_check_single_feature FEATURE_NAME FEATURE_NUMBER 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
+        ecbuild_try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
             "${_bindir}_fail" "${_SRCFILE_FAIL}")
         IF (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
           SET(${RESULT_VAR} TRUE)
diff --git a/cmake/ecbuild-config-version.cmake b/cmake/ecbuild-config-version.cmake
index 3ca2385..cc75b7a 100644
--- a/cmake/ecbuild-config-version.cmake
+++ b/cmake/ecbuild-config-version.cmake
@@ -1,4 +1,4 @@
-set(PACKAGE_VERSION "2.6.0")
+set(PACKAGE_VERSION "2.7.3")
 
 # check whether the requested PACKAGE_FIND_VERSION is compatible
 
diff --git a/cmake/ecbuild-config.cmake b/cmake/ecbuild-config.cmake
index 73fe5a1..58a987c 100644
--- a/cmake/ecbuild-config.cmake
+++ b/cmake/ecbuild-config.cmake
@@ -28,9 +28,9 @@ set( ECBUILD_TPL_INCLUDE_DIRS  "" )
 set( ECBUILD_TPL_DEFINITIONS   "" )
 set( ECBUILD_TPL_LIBRARIES     "" )
 
-set( ECBUILD_VERSION           "2.6.0" )
-set( ECBUILD_GIT_SHA1          "2967c31ee4768c165e61cab919c370a54dde0772" )
-set( ECBUILD_GIT_SHA1_SHORT    "2967c31" )
+set( ECBUILD_VERSION           "2.7.3" )
+set( ECBUILD_GIT_SHA1          "055757d98aa35039ec9abbdd5101d29438966d1e" )
+set( ECBUILD_GIT_SHA1_SHORT    "055757d" )
 
 ### export include paths as absolute paths
 
@@ -75,7 +75,7 @@ if( NOT ecbuild_BINARY_DIR )
   if( ECBUILD_IS_BUILD_DIR_EXPORT )
     include( "/tmp/metabuilds/ecflow-metab_5062/leap42/ecbuild/builds/ecbuild-targets.cmake" OPTIONAL )
   else()
-    include( "${ECBUILD_CMAKE_DIR}/ecbuild-targets.cmake" )
+    include( "${ECBUILD_CMAKE_DIR}/ecbuild-targets.cmake" OPTIONAL )
   endif()
 
 endif()
diff --git a/cmake/ecbuild_add_executable.cmake b/cmake/ecbuild_add_executable.cmake
index 5d78348..f6cb128 100644
--- a/cmake/ecbuild_add_executable.cmake
+++ b/cmake/ecbuild_add_executable.cmake
@@ -27,6 +27,7 @@
 #                           [ GENERATED <file1> [<file2> ...] ]
 #                           [ DEPENDS <target1> [<target2> ...] ]
 #                           [ CONDITION <condition> ]
+#                           [ PROPERTIES <prop1> <val1> [<prop2> <val2> ...] ]
 #                           [ NOINSTALL ]
 #                           [ VERSION <version> | AUTO_VERSION ]
 #                           [ CFLAGS <flag1> [<flag2> ...] ]
@@ -80,6 +81,9 @@
 #   conditional expression which must evaluate to true for this target to be
 #   built (must be valid in a CMake ``if`` statement)
 #
+# PROPERTIES : optional
+#   custom properties to set on the target
+#
 # NOINSTALL : optional
 #   do not install the executable
 #
@@ -110,7 +114,9 @@ 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 SOURCES_GLOB SOURCES_EXCLUDE_REGEX OBJECTS TEMPLATES LIBS INCLUDES DEPENDS PERSISTENT DEFINITIONS CFLAGS CXXFLAGS FFLAGS GENERATED CONDITION )
+  set( multi_value_args SOURCES SOURCES_GLOB SOURCES_EXCLUDE_REGEX OBJECTS
+                        TEMPLATES LIBS INCLUDES DEPENDS PERSISTENT DEFINITIONS
+                        CFLAGS CXXFLAGS FFLAGS GENERATED CONDITION PROPERTIES )
 
   cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
 
@@ -148,12 +154,6 @@ macro( ecbuild_add_executable )
       list( APPEND _all_objects $<TARGET_OBJECTS:${_obj}> )
     endforeach()
 
-    list( APPEND _PAR_SOURCES ${_glob_srcs} )
-
-    if( ECBUILD_LIST_SOURCES )
-      ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
-    endif()
-
     # glob sources
     unset( _glob_srcs )
     foreach( pattern ${_PAR_SOURCES_GLOB} )
@@ -164,6 +164,12 @@ macro( ecbuild_add_executable )
       ecbuild_list_exclude_pattern( LIST _glob_srcs REGEX "${pattern}" )
     endforeach()
 
+    list( APPEND _PAR_SOURCES ${_glob_srcs} )
+
+    if( ECBUILD_LIST_SOURCES )
+      ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): sources ${_PAR_SOURCES}")
+    endif()
+
     # add persistent layer files
     if( DEFINED _PAR_PERSISTENT )
       if( DEFINED PERSISTENT_NAMESPACE )
@@ -201,6 +207,11 @@ macro( ecbuild_add_executable )
       cuda_add_executable( ${_PAR_TARGET} ${_PAR_SOURCES}  ${_all_objects} )
     endif()
 
+    # Set custom properties
+    if( ${_PAR_PROPERTIES} )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES ${_PAR_PROPERTIES} )
+    endif()
+
     # ecbuild_echo_target( ${_PAR_TARGET} )
 
     # add include dirs if defined
@@ -279,7 +290,7 @@ macro( ecbuild_add_executable )
 
       # set build location
 
-      set_property( TARGET ${_PAR_TARGET} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES 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)
 
@@ -288,8 +299,8 @@ macro( ecbuild_add_executable )
     else()
       ecbuild_debug("ecbuild_add_executable(${_PAR_TARGET}): not installing")
       # 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 )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES SKIP_BUILD_RPATH         FALSE )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES BUILD_WITH_INSTALL_RPATH FALSE )
     endif()
 
     # add definitions to compilation
@@ -297,13 +308,13 @@ macro( ecbuild_add_executable )
       get_property( _target_defs TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS )
       list( APPEND _target_defs ${_PAR_DEFINITIONS} )
       ecbuild_debug("ecbuild_add_executable(${_PAR_TARGET}): using definitions ${_target_defs}")
-      set_property( TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS ${_target_defs} )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES COMPILE_DEFINITIONS "${_target_defs}" )
     endif()
 
     # set linker language
     if( DEFINED _PAR_LINKER_LANGUAGE )
       ecbuild_debug("ecbuild_add_executable(${_PAR_TARGET}): using linker language ${_PAR_LINKER_LANGUAGE}")
-      set_property( TARGET ${_PAR_TARGET} PROPERTY LINKER_LANGUAGE ${_PAR_LINKER_LANGUAGE} )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES LINKER_LANGUAGE ${_PAR_LINKER_LANGUAGE} )
       if( ECBUILD_${_PAR_LINKER_LANGUAGE}_IMPLICIT_LINK_LIBRARIES )
         target_link_libraries( ${_PAR_TARGET} ${ECBUILD_${_PAR_LINKER_LANGUAGE}_IMPLICIT_LINK_LIBRARIES} )
       endif()
diff --git a/cmake/ecbuild_add_library.cmake b/cmake/ecbuild_add_library.cmake
index ee29008..e267333 100644
--- a/cmake/ecbuild_add_library.cmake
+++ b/cmake/ecbuild_add_library.cmake
@@ -30,6 +30,7 @@
 #                        [ GENERATED <file1> [<file2> ...] ]
 #                        [ DEPENDS <target1> [<target2> ...] ]
 #                        [ CONDITION <condition> ]
+#                        [ PROPERTIES <prop1> <val1> [<prop2> <val2> ...] ]
 #                        [ NOINSTALL ]
 #                        [ HEADER_DESTINATION <path> ]
 #                        [ INSTALL_HEADERS LISTED|ALL ]
@@ -105,6 +106,9 @@
 #   conditional expression which must evaluate to true for this target to be
 #   built (must be valid in a CMake ``if`` statement)
 #
+# PROPERTIES : optional
+#   custom properties to set on the target
+#
 # NOINSTALL : optional
 #   do not install the library
 #
@@ -155,8 +159,14 @@
 function( ecbuild_add_library_impl )
 
   set( options NOINSTALL AUTO_VERSION AUTO_SOVERSION )
-  set( single_value_args TARGET TYPE COMPONENT INSTALL_HEADERS INSTALL_HEADERS_REGEX LINKER_LANGUAGE HEADER_DESTINATION VERSION SOVERSION OUTPUT_NAME )
-  set( multi_value_args  SOURCES SOURCES_GLOB SOURCES_EXCLUDE_REGEX OBJECTS TEMPLATES LIBS INCLUDES PRIVATE_INCLUDES PUBLIC_INCLUDES DEPENDS PERSISTENT DEFINITIONS INSTALL_HEADERS_LIST CFLAGS CXXFLAGS FFLAGS GENERATED CONDITION )
+  set( single_value_args TARGET TYPE COMPONENT INSTALL_HEADERS
+                         INSTALL_HEADERS_REGEX LINKER_LANGUAGE
+                         HEADER_DESTINATION VERSION SOVERSION OUTPUT_NAME )
+  set( multi_value_args  SOURCES SOURCES_GLOB SOURCES_EXCLUDE_REGEX OBJECTS
+                         TEMPLATES LIBS INCLUDES PRIVATE_INCLUDES
+                         PUBLIC_INCLUDES DEPENDS PERSISTENT DEFINITIONS
+                         INSTALL_HEADERS_LIST CFLAGS CXXFLAGS FFLAGS GENERATED
+                         CONDITION PROPERTIES )
 
   cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
 
@@ -263,6 +273,11 @@ function( ecbuild_add_library_impl )
     endif()
     # ecbuild_echo_target( ${_PAR_TARGET} )
 
+    # Set custom properties
+    if( ${_PAR_PROPERTIES} )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES ${_PAR_PROPERTIES} )
+    endif()
+
     # set OUTPUT_NAME
 
     if( DEFINED _PAR_OUTPUT_NAME )
@@ -283,7 +298,11 @@ function( ecbuild_add_library_impl )
       list(REMOVE_ITEM _PAR_LIBS optimized)
       foreach( lib ${_PAR_LIBS} ) # skip NOTFOUND
         if( lib )
-          ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): linking with ${lib}")
+
+          string(REGEX REPLACE "[ ]+$" "" ${lib} "${${lib}}") # strips leading whitespaces
+          string(REGEX REPLACE "^[ ]+" "" ${lib} "${${lib}}") # strips trailing whitespaces
+
+          ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): linking with [${lib}]")
           target_link_libraries( ${_PAR_TARGET} ${lib} )
         else()
           ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): ${lib} not found - not linking")
@@ -394,7 +413,7 @@ function( ecbuild_add_library_impl )
     # set linker language
     if( DEFINED _PAR_LINKER_LANGUAGE )
       ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): using linker language ${_PAR_LINKER_LANGUAGE}")
-      set_property( TARGET ${_PAR_TARGET} PROPERTY LINKER_LANGUAGE ${_PAR_LINKER_LANGUAGE} )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES LINKER_LANGUAGE ${_PAR_LINKER_LANGUAGE} )
       if( ECBUILD_${_PAR_LINKER_LANGUAGE}_IMPLICIT_LINK_LIBRARIES )
         target_link_libraries( ${_PAR_TARGET} ${ECBUILD_${_PAR_LINKER_LANGUAGE}_IMPLICIT_LINK_LIBRARIES} )
       endif()
@@ -430,47 +449,51 @@ function( ecbuild_add_library_impl )
         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} )
+      if(ECBUILD_INSTALL_LIBRARY_HEADERS)
+
+        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( 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()
+          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( _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" )
+
+        if( DEFINED _PAR_INSTALL_HEADERS_LIST )
+          install( FILES ${_PAR_INSTALL_HEADERS_LIST} DESTINATION ${_h_destination} )
         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()
 
-      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 )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES 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)
 
@@ -483,7 +506,7 @@ function( ecbuild_add_library_impl )
       get_property( _target_defs TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS )
       list( APPEND _target_defs ${_PAR_DEFINITIONS} )
       ecbuild_debug("ecbuild_add_library(${_PAR_TARGET}): using definitions ${_target_defs}")
-      set_property( TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS ${_target_defs} )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES COMPILE_DEFINITIONS "${_target_defs}" )
     endif()
 
     # make sure target is removed before - some problems with AIX
diff --git a/cmake/ecbuild_add_persistent.cmake b/cmake/ecbuild_add_persistent.cmake
index e5a875b..40d7ad2 100644
--- a/cmake/ecbuild_add_persistent.cmake
+++ b/cmake/ecbuild_add_persistent.cmake
@@ -60,6 +60,8 @@ macro( ecbuild_add_persistent )
     ecbuild_critical("The call to ecbuild_add_persistent() doesn't specify the FILES.")
   endif()
 
+  ecbuild_debug( "ecbuild_add_persistent: adding persistent layer for ${_PAR_FILES}" )
+
   foreach( file ${_PAR_FILES} )
 
     get_filename_component( _file_dir    ${file} PATH )
@@ -71,7 +73,7 @@ macro( ecbuild_add_persistent )
       set( file ${_file_dir}/${_file_we} )
     endif()
 
-    # ecbuild_debug_var(file)
+    ecbuild_debug( "ecbuild_add_persistent: adding persistent layer for ${file}.b with namespace ${_PAR_NAMESPACE} from ${file}.h in ${CMAKE_CURRENT_BINARY_DIR}/${_file_dir}" )
 
     add_custom_command( OUTPUT  ${file}.b
                         COMMAND ${PERL_EXECUTABLE} ${sg_perl} ${CMAKE_CURRENT_SOURCE_DIR}/${file}.h
diff --git a/cmake/ecbuild_add_resources.cmake b/cmake/ecbuild_add_resources.cmake
index 2dfaa5e..51b1e68 100644
--- a/cmake/ecbuild_add_resources.cmake
+++ b/cmake/ecbuild_add_resources.cmake
@@ -51,6 +51,13 @@
 #   list of regular expressions to match files and directories to exclude when
 #   packaging
 #
+# Note
+# ----
+#
+# All file and directory names are also *partially matched*. To ensure that
+# only the exact file or directory name is matched at the end of the path add
+# a ``$`` at the end and quote the name.
+#
 ##############################################################################
 
 macro( ecbuild_add_resources )
diff --git a/cmake/ecbuild_add_test.cmake b/cmake/ecbuild_add_test.cmake
index 1da8568..7050159 100644
--- a/cmake/ecbuild_add_test.cmake
+++ b/cmake/ecbuild_add_test.cmake
@@ -35,6 +35,7 @@
 #                     [ DEPENDS <target1> [<target2> ...] ]
 #                     [ TEST_DEPENDS <target1> [<target2> ...] ]
 #                     [ CONDITION <condition> ]
+#                     [ PROPERTIES <prop1> <val1> [<prop2> <val2> ...] ]
 #                     [ ENVIRONMENT <variable1> [<variable2> ...] ]
 #                     [ WORKING_DIRECTORY <path> ]
 #                     [ CFLAGS <flag1> [<flag2> ...] ]
@@ -131,6 +132,9 @@
 #   conditional expression which must evaluate to true for this target to be
 #   built (must be valid in a CMake ``if`` statement)
 #
+# PROPERTIES : optional
+#   custom properties to set on the target
+#
 # ENVIRONMENT : optional
 #   list of environment variables to set in the test environment
 #
@@ -157,7 +161,7 @@ macro( ecbuild_add_test )
   set( single_value_args TARGET ENABLED COMMAND TYPE LINKER_LANGUAGE MPI OMP WORKING_DIRECTORY )
   set( multi_value_args  SOURCES OBJECTS LIBS INCLUDES TEST_DEPENDS DEPENDS LABELS ARGS
                          PERSISTENT DEFINITIONS RESOURCES TEST_DATA CFLAGS
-                         CXXFLAGS FFLAGS GENERATED CONDITION ENVIRONMENT )
+                         CXXFLAGS FFLAGS GENERATED CONDITION PROPERTIES ENVIRONMENT )
 
   cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
 
@@ -220,30 +224,6 @@ macro( ecbuild_add_test )
     endif()
   endif()
 
-  if( _PAR_TYPE MATCHES "PYTHON" )
-    if( PYTHONINTERP_FOUND )
-      set( _PAR_COMMAND ${PYTHON_EXECUTABLE} )
-      set( _PAR_LABELS python ${_PAR_LABELS} )
-    else()
-      ecbuild_warn( "Requested a python test but python interpreter not found - disabling test\nPYTHON_EXECUTABLE: [${PYTHON_EXECUTABLE}]" )
-      set( _PAR_ENABLED 0 )
-    endif()
-  endif()
-
-  ### further checks
-
-  if( _PAR_ENABLED AND NOT _PAR_TARGET AND NOT _PAR_COMMAND )
-    ecbuild_critical("The call to ecbuild_add_test() defines neither a TARGET nor a COMMAND.")
-  endif()
-
-  if( _PAR_ENABLED AND NOT _PAR_COMMAND AND NOT _PAR_SOURCES )
-    ecbuild_critical("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 )
-    ecbuild_critical("The call to ecbuild_add_test() defines a 'script' but doesn't specify the COMMAND.")
-  endif()
-
   ### conditional build
 
   if( DEFINED _PAR_CONDITION )
@@ -281,6 +261,30 @@ macro( ecbuild_add_test )
 
   if( ENABLE_TESTS AND _${_PAR_TARGET}_condition )
 
+    if( _PAR_TYPE MATCHES "PYTHON" )
+      if( PYTHONINTERP_FOUND )
+        set( _PAR_COMMAND ${PYTHON_EXECUTABLE} )
+        set( _PAR_LABELS python ${_PAR_LABELS} )
+      else()
+        ecbuild_warn( "Requested a python test but python interpreter not found - disabling test\nPYTHON_EXECUTABLE: [${PYTHON_EXECUTABLE}]" )
+        set( _PAR_ENABLED 0 )
+      endif()
+    endif()
+
+    ### further checks
+
+    if( _PAR_ENABLED AND NOT _PAR_TARGET AND NOT _PAR_COMMAND )
+      ecbuild_critical("The call to ecbuild_add_test() defines neither a TARGET nor a COMMAND.")
+    endif()
+
+    if( _PAR_ENABLED AND NOT _PAR_COMMAND AND NOT _PAR_SOURCES )
+      ecbuild_critical("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 )
+      ecbuild_critical("The call to ecbuild_add_test() defines a 'script' but doesn't specify the COMMAND.")
+    endif()
+
     # add resources
 
     if( DEFINED _PAR_RESOURCES )
@@ -374,21 +378,21 @@ macro( ecbuild_add_test )
 
       if( _target_defs )
         ecbuild_debug("ecbuild_add_test(${_PAR_TARGET}): using definitions ${_target_defs}")
-        set_property( TARGET ${_PAR_TARGET} PROPERTY COMPILE_DEFINITIONS ${_target_defs} )
+        set_target_properties( ${_PAR_TARGET} PROPERTIES COMPILE_DEFINITIONS "${_target_defs}" )
       endif()
 
       # 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 ${_TEST_DIR} )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${_TEST_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_target_properties( ${_PAR_TARGET} PROPERTIES BUILD_WITH_INSTALL_RPATH FALSE )
+      set_target_properties( ${_PAR_TARGET} PROPERTIES SKIP_BUILD_RPATH         FALSE )
 
       # set linker language
       if( DEFINED _PAR_LINKER_LANGUAGE )
         ecbuild_debug("ecbuild_add_test(${_PAR_TARGET}): using linker language ${_PAR_LINKER_LANGUAGE}")
-        set_property( TARGET ${_PAR_TARGET} PROPERTY LINKER_LANGUAGE ${_PAR_LINKER_LANGUAGE} )
+        set_target_properties( ${_PAR_TARGET} PROPERTIES LINKER_LANGUAGE ${_PAR_LINKER_LANGUAGE} )
       endif()
 
       # make sure target is removed before - some problems with AIX
@@ -452,6 +456,11 @@ macro( ecbuild_add_test )
         add_test( NAME ${_PAR_TARGET} COMMAND ${_PAR_TARGET}  ${TEST_ARGS} ${_working_dir} ) # run the test that was generated
       endif()
 
+      # Set custom properties
+      if( ${_PAR_PROPERTIES} )
+        set_target_properties( ${_PAR_TARGET} PROPERTIES ${_PAR_PROPERTIES} )
+      endif()
+
       # get test data
 
       if( _PAR_TEST_DATA )
diff --git a/cmake/ecbuild_append_to_rpath.cmake b/cmake/ecbuild_append_to_rpath.cmake
index 895f837..38ecbb2 100644
--- a/cmake/ecbuild_append_to_rpath.cmake
+++ b/cmake/ecbuild_append_to_rpath.cmake
@@ -67,7 +67,12 @@ macro( ecbuild_append_to_rpath RPATH_DIRS )
 
 				endif()
 
-				if( EC_OS_NAME STREQUAL "linux" )
+                if( EC_OS_NAME STREQUAL "freebsd" )
+                    _path_append( CMAKE_INSTALL_RPATH "$ORIGIN/${RPATH_DIR}" )
+                    set( _done 1 )
+                endif()
+
+                if( EC_OS_NAME STREQUAL "linux" )
 					_path_append( CMAKE_INSTALL_RPATH "$ORIGIN/${RPATH_DIR}" )
 					set( _done 1 )
 				endif()
@@ -77,10 +82,10 @@ macro( ecbuild_append_to_rpath RPATH_DIRS )
 					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()
+                if( EC_OS_NAME STREQUAL "aix" ) # always relative to exectuable path
+                    _path_append( CMAKE_INSTALL_RPATH "${RPATH_DIR}" )
+                    set( _done 1 )
+                endif()
 
 				# fallback
 
diff --git a/cmake/ecbuild_bundle.cmake b/cmake/ecbuild_bundle.cmake
index 6a49354..9778e27 100644
--- a/cmake/ecbuild_bundle.cmake
+++ b/cmake/ecbuild_bundle.cmake
@@ -130,9 +130,12 @@ macro( ecbuild_bundle )
 
   string(TOUPPER "${_PAR_PROJECT}" PNAME)
 
+  ecbuild_info( "---------------------------------------------------------" )
+
   if( BUNDLE_SKIP_${PNAME} )
-    ecbuild_info( "Skipping bundle project ${PNAME}" )
+    ecbuild_info( "Skipping bundle project ${_PAR_PROJECT}" )
   else()
+    ecbuild_info( "Adding bundle project ${_PAR_PROJECT}" )
 
     if( _PAR_STASH )
       ecmwf_stash( PROJECT ${_PAR_PROJECT} DIR ${PROJECT_SOURCE_DIR}/${_PAR_PROJECT} STASH ${_PAR_STASH} ${_PAR_UNPARSED_ARGUMENTS} )
@@ -149,7 +152,10 @@ macro( ecbuild_bundle )
       ecbuild_critical("Source directory '${CMAKE_CURRENT_SOURCE_DIR}/${_PAR_PROJECT}' for subproject '${_PAR_PROJECT}' does not exist or does not contain a CMakeLists.txt file.")
     endif()
 
-    ecbuild_use_package( PROJECT ${_PAR_PROJECT} )
+    # Do not descend into ecbuild if included in a bundle (ECBUILD-333)
+    if( NOT _PAR_PROJECT STREQUAL "ecbuild" )
+      ecbuild_use_package( PROJECT ${_PAR_PROJECT} )
+    endif()
   endif()
 
 endmacro()
diff --git a/cmake/ecbuild_check_c_source_return.cmake b/cmake/ecbuild_check_c_source_return.cmake
index 38d89f7..b92042b 100644
--- a/cmake/ecbuild_check_c_source_return.cmake
+++ b/cmake/ecbuild_check_c_source_return.cmake
@@ -43,8 +43,8 @@
 # -----
 #
 # This will write the given source to a .c file and compile and run it with
-# try_run. If successful, ``${VAR}`` is set to 1 and ``${OUTPUT}`` is set to
-# the output of the successful run in the CMake cache.
+# ecbuild_try_run. If successful, ``${VAR}`` is set to 1 and ``${OUTPUT}`` is
+# set to the output of the successful run in the CMake cache.
 #
 # The check will not run if ``${VAR}`` is defined (e.g. from ecBuild cache).
 #
@@ -95,12 +95,12 @@ macro( ecbuild_check_c_source_return SOURCE )
     
         # write the source file
     
-        file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.c" "${SOURCE}\n" )
+        file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckCSource/test_${_PAR_VAR}.c" "${SOURCE}\n" )
 
         ecbuild_debug( "Performing Test ${_PAR_VAR}" )
-        try_run( ${_PAR_VAR}_EXITCODE ${_PAR_VAR}_COMPILED
+        ecbuild_try_run( ${_PAR_VAR}_EXITCODE ${_PAR_VAR}_COMPILED
           ${CMAKE_BINARY_DIR}
-          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.c
+          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckCSource/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}
@@ -114,6 +114,10 @@ macro( ecbuild_check_c_source_return SOURCE )
           set( ${_PAR_VAR}_EXITCODE 1 )
         endif()
     
+        ecbuild_debug_var( ${_PAR_VAR}_EXITCODE )
+        ecbuild_debug_var( ${_PAR_VAR}_COMPILED )
+        ecbuild_debug_var( compile_OUTPUT )
+        ecbuild_debug_var( run_OUTPUT )
         # if the return value was 0 then it worked
         if("${${_PAR_VAR}_EXITCODE}" EQUAL 0)
     
diff --git a/cmake/ecbuild_check_compiler.cmake b/cmake/ecbuild_check_compiler.cmake
index 197f0b5..dd09c0f 100644
--- a/cmake/ecbuild_check_compiler.cmake
+++ b/cmake/ecbuild_check_compiler.cmake
@@ -95,6 +95,10 @@ if( CMAKE_CXX_COMPILER_LOADED AND ENABLE_OS_TESTS )
     ecbuild_cache_check_cxx_source_compiles( "#include <sstream>\nint main() { std::stringstream s; }"
 	  EC_HAVE_CXX_SSTREAM )
 
+    # test c++ __int128
+    ecbuild_cache_check_cxx_source_compiles( "int main(){ __int128 i = 0; return 0;}\n"
+      EC_HAVE_CXX_INT_128 )
+
 endif()
 
 ############################################################################################
diff --git a/cmake/ecbuild_check_cxx11.cmake b/cmake/ecbuild_check_cxx11.cmake
index d2f9629..a7b551c 100644
--- a/cmake/ecbuild_check_cxx11.cmake
+++ b/cmake/ecbuild_check_cxx11.cmake
@@ -58,7 +58,7 @@ function( ecbuild_check_cxx11 )
   cxx11_find_all_features( ALL_FEATURES ) # list all available features to check
 
   # Save CXX flags
-  set( CXX_FLAGS_SNASHOT ${CMAKE_CXX_FLAGS} )
+  set( CXX_FLAGS_SNAPSHOT ${CMAKE_CXX_FLAGS} )
 
   # Add C++11 flags
   include( ${ECBUILD_MACROS_DIR}/ecbuild_get_cxx11_flags.cmake )
diff --git a/cmake/ecbuild_check_cxx_source_return.cmake b/cmake/ecbuild_check_cxx_source_return.cmake
index 7270540..5b4b478 100644
--- a/cmake/ecbuild_check_cxx_source_return.cmake
+++ b/cmake/ecbuild_check_cxx_source_return.cmake
@@ -43,8 +43,8 @@
 # -----
 #
 # This will write the given source to a .cxx file and compile and run it with
-# try_run. If successful, ``${VAR}`` is set to 1 and ``${OUTPUT}`` is set to
-# the output of the successful run in the CMake cache.
+# ecbuild_try_run. If successful, ``${VAR}`` is set to 1 and ``${OUTPUT}`` is
+# set to the output of the successful run in the CMake cache.
 #
 # The check will not run if ``${VAR}`` is defined (e.g. from ecBuild cache).
 #
@@ -96,12 +96,12 @@ macro( ecbuild_check_cxx_source_return SOURCE )
 
         # write the source file
 
-        file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_p_VAR}.cxx" "${SOURCE}\n" )
+        file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckCXXSource/test_${_p_VAR}.cxx" "${SOURCE}\n" )
 
         ecbuild_debug( "${_msg}" )
-        try_run( ${_p_VAR}_EXITCODE ${_p_VAR}_COMPILED
+        ecbuild_try_run( ${_p_VAR}_EXITCODE ${_p_VAR}_COMPILED
           ${CMAKE_BINARY_DIR}
-          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_p_VAR}.cxx
+          ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CheckCXXSource/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}
diff --git a/cmake/ecbuild_check_fortran_source_return.cmake b/cmake/ecbuild_check_fortran_source_return.cmake
index 92168b9..f8ccf05 100644
--- a/cmake/ecbuild_check_fortran_source_return.cmake
+++ b/cmake/ecbuild_check_fortran_source_return.cmake
@@ -43,8 +43,8 @@
 # -----
 #
 # This will write the given source to a .f file and compile and run it with
-# try_run. If successful, ``${VAR}`` is set to 1 and ``${OUTPUT}`` is set to
-# the output of the successful run in the CMake cache.
+# ecbuild_try_run. If successful, ``${VAR}`` is set to 1 and ``${OUTPUT}`` is
+# set to the output of the successful run in the CMake cache.
 #
 # The check will not run if ``${VAR}`` is defined (e.g. from ecBuild cache).
 #
@@ -98,7 +98,7 @@ macro( ecbuild_check_fortran_source_return SOURCE )
         file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.F90" "${SOURCE}\n" )
 
         ecbuild_debug( "Performing Test ${_PAR_VAR}" )
-        try_run( ${_PAR_VAR}_EXITCODE ${_PAR_VAR}_COMPILED
+        ecbuild_try_run( ${_PAR_VAR}_EXITCODE ${_PAR_VAR}_COMPILED
           ${CMAKE_BINARY_DIR}
           ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test_${_PAR_VAR}.F90
           COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
diff --git a/cmake/ecbuild_check_functions.cmake b/cmake/ecbuild_check_functions.cmake
index 4307429..30d8013 100644
--- a/cmake/ecbuild_check_functions.cmake
+++ b/cmake/ecbuild_check_functions.cmake
@@ -96,6 +96,9 @@ if( ENABLE_OS_FUNCTIONS_TEST )
     # 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 fopencookie
+    ecbuild_cache_check_c_source_compiles( "#define _GNU_SOURCE\n#include <stdio.h>\nint main(){ void* cookie; const char* mode; cookie_io_functions_t iof; FILE* fopencookie(void *cookie, const char *mode, cookie_io_functions_t iof); }" EC_HAVE_FOPENCOOKIE )
+
     # test for fsync
     ecbuild_cache_check_symbol_exists(fsync "unistd.h" EC_HAVE_FSYNC)
     # test for fdatasync
@@ -119,6 +122,8 @@ if( ENABLE_OS_FUNCTIONS_TEST )
     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 d_type in dirent.h
+    ecbuild_cache_check_c_source_compiles( "#include <dirent.h>\nint main(){ DIR *dirp; struct dirent *entry; if(entry->d_type) { dirp = 0; } }\n" EC_HAVE_DIRENT_D_TYPE )
     # 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 )
 
diff --git a/cmake/ecbuild_check_os.cmake b/cmake/ecbuild_check_os.cmake
index be92c87..aaf2f79 100644
--- a/cmake/ecbuild_check_os.cmake
+++ b/cmake/ecbuild_check_os.cmake
@@ -44,6 +44,7 @@ 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         )
@@ -205,31 +206,160 @@ if( ENABLE_OS_ENDINESS_TEST )
 endif()
 
 ############################################################################################
-# enable profiling
+# enable profiling via gprof
 
 if( ENABLE_PROFILING )
+  ecbuild_deprecate( "ENABLE_PROFILING is deprecated and ignored, use ENABLE_GPROF instead" )
+endif()
 
-  if( CMAKE_C_COMPILER_ID MATCHES "GNU" )
-
-    set( _flags "-pg --coverage" )
+if( ENABLE_GPROF )
+
+  # User defined profiling flag takes precedence
+  if( ECBUILD_GPROF_FLAG )
+
+    ecbuild_debug( "Enabling profiling with user defined flag '${ECBUILD_GPROF_FLAG}'" )
+
+  # -p  Generate extra code to write profile information suitable for the analysis program
+  #     prof.  You must use this option when compiling the source files you want data about,
+  #     and you must also use it when linking.
+  #
+  # -pg Generate extra code to write profile information suitable for the analysis program
+  #     gprof.  You must use this option when compiling the source files you want data about,
+  #     and you must also use it when linking.
+  #
+  # --coverage
+  #      This option is used to compile and link code instrumented for coverage analysis.  The
+  #      option is a synonym for -fprofile-arcs -ftest-coverage (when compiling) and -lgcov
+  #      (when linking).  See the documentation for those options for more details.
+  #
+  #      *   Compile the source files with -fprofile-arcs plus optimization and code generation
+  #          options.  For test coverage analysis, use the additional -ftest-coverage option.
+  #          You do not need to profile every source file in a program.
+  #
+  #      *   Link your object files with -lgcov or -fprofile-arcs (the latter implies the
+  #          former).
+  #
+  #      *   Run the program on a representative workload to generate the arc profile
+  #          information.  This may be repeated any number of times.  You can run concurrent
+  #          instances of your program, and provided that the file system supports locking, the
+  #          data files will be correctly updated.  Also "fork" calls are detected and correctly
+  #          handled (double counting will not happen).
+  #
+  #      *   For profile-directed optimizations, compile the source files again with the same
+  #          optimization and code generation options plus -fbranch-probabilities.
+  #
+  #      *   For test coverage analysis, use gcov to produce human readable information from the
+  #          .gcno and .gcda files.  Refer to the gcov documentation for further information.
+  #
+  #      With -fprofile-arcs, for each function of your program GCC creates a program flow
+  #      graph, then finds a spanning tree for the graph.  Only arcs that are not on the
+  #      spanning tree have to be instrumented: the compiler adds code to count the number of
+  #      times that these arcs are executed.  When an arc is the only exit or only entrance to a
+  #      block, the instrumentation code can be added to the block; otherwise, a new basic block
+  #      must be created to hold the instrumentation code.
+  elseif( CMAKE_C_COMPILER_ID MATCHES "GNU" )
+
+    set( ECBUILD_GPROF_FLAG "-pg --coverage" )
+    ecbuild_debug( "Enabling profiling with GNU flag '${ECBUILD_GPROF_FLAG}'" )
+
+  # -p
+  #
+  #        Compiles and links for function profiling
+  #               with gprof(1).
+  #
+  #        Architecture  Restrictions:  Not  available  on  Intel(R)   64   architecture
+  #        targeting the
+  #               Intel(R)  Xeon  Phi(TM) coprocessor x100 product family (formerly code
+  #               name  Knights  Corner),  on  IA-32  architecture  targeting   Intel(R)
+  #               Graphics Technology, or on Intel(R) 64 architecture targeting Intel(R)
+  #               Graphics Technology
+  #
+  #        Arguments:
+  #
+  #        None
+  #
+  #        Default:
+  #
+  #        OFF               Files are compiled and linked without profiling.
+  #
+  #        Description:
+  #
+  #        This option compiles and links for function profiling with gprof(1).
+  #
+  #        When you specify this option, inlining is disabled. However, you can override
+  #        this  by  specifying  pragma forceinline, declspec forceinline (Windows* OS),
+  #        attribute always_inline (Linux* OS and OS X*), or a compiler option  such  as
+  #        [Q]inline-forceinline.
+  elseif( CMAKE_C_COMPILER_ID MATCHES "Intel" )
+
+    set( ECBUILD_GPROF_FLAG "-p" )
+    ecbuild_debug( "Enabling profiling with Intel flag '${ECBUILD_GPROF_FLAG}'" )
+
+  # -Mprof[=option[,option,...]]
+  #        Set performance profiling options.  Use of these options will cause the resulting
+  #        executable to create a performance profile that can be viewed and analyzed with the
+  #        PGPROF performance profiler.  In the descriptions below, PGI-style profiling implies
+  #        compiler-generated source instrumentation.  MPICH-style profiling implies the use of
+  #        instrumented wrappers for MPI library routines.  The -Mprof options are:
+  #
+  #        ccff
+  #
+  #        dwarf     Generate limited DWARF symbol information sufficient for most performance
+  #                  profilers.
+  #
+  #        func      Perform PGI-style function level profiling.
+  #
+  #        hwcts     Generate a profile using event-based sampling of hardware counters via the
+  #                  PAPI interface (linux86-64 only, PAPI must be installed).
+  #
+  #        lines     Perform PGI-style line level profiling.
+  #
+  #        hpmpi     (PGI CDK only) Perform MPICH-style profiling for the HP Implies
+  #                  -Mmpi=hpmpi.
+  #
+  #        mpich1    (PGI CDK only) Perform MPICH-style profiling for MPICH-1.  Implies
+  #                  -Mmpi=mpich1.  Use MPIDIR to point to the MPICH-1 libraries.  This flag is
+  #                  no longer fully supported.
+  #
+  #        mpich2    (PGI CDK only) Perform MPICH-style profiling for MPICH-2.  Implies
+  #                  -Mmpi=mpich2.  Use MPIDIR to point to the MPICH-1 libraries.  This flag is
+  #                  no longer fully supported.
+  #
+  #        mvapich1  (PGI CDK only) Perform MPICH-style profiling for MVAPICH.  Implies
+  #                  -Mmpi=mvapich1.  Use MPIDIR to point to the MPICH-1 libraries.  This flag
+  #                  is no longer fully supported.
+  #
+  #        time      Generate a profile using time-based instruction-level statistical
+  #                  sampling. This is equivalent to -pg, except that the profile is saved in a
+  #                  file named pgprof.out instead of gmon.out.
+  #
+  #        On Linux systems that have OProfile installed, PGPROF supports collection of
+  #        performance data without recompilation. Use of -Mprof=dwarf is useful for this mode
+  #        of profiling.
+  elseif( CMAKE_C_COMPILER_ID MATCHES "PGI" )
+
+    set( ECBUILD_GPROF_FLAG "-Mprof=dwarf,time" )
+    ecbuild_debug( "Enabling profiling with PGI flag '${ECBUILD_GPROF_FLAG}'" )
+
+  # There is no equivalent to -pg for clang:
+  # http://lists.llvm.org/pipermail/cfe-dev/2010-September/011255.html
+  else()
 
-    set( CMAKE_EXE_LINKER_FLAGS    "${CMAKE_EXE_LINKER_FLAGS} ${_flags}" )
-    set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${_flags}" )
-    set( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${_flags}" )
+    ecbuild_warn( "Profiling enabled but ecbuild doesn't know how to enable for this particular compiler ${CMAKE_C_COMPILER_ID}")
 
-    set( _trust_flags ${ECBUILD_TRUST_FLAGS} )
-    set( ECBUILD_TRUST_FLAGS ON )
-    ecbuild_add_c_flags( "${_flags}" )
-    ecbuild_add_cxx_flags( "${_flags}" )
-    ecbuild_add_fortran_flags( "${_flags}" )
-    set( ECBUILD_TRUST_FLAGS ${_trust_flags} )
-    unset( _trust_flags )
+  endif()
 
-    unset( _flags )
+  set( CMAKE_EXE_LINKER_FLAGS    "${CMAKE_EXE_LINKER_FLAGS} ${ECBUILD_GPROF_FLAG}" )
+  set( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ECBUILD_GPROF_FLAG}" )
+  set( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${ECBUILD_GPROF_FLAG}" )
 
-  else()
-    ecbuild_warn( "Profiling enabled but ecbuild doesn't know how to enable for this particular compiler ${CMAKE_C_COMPILER_ID}")
-  endif()
+  set( _trust_flags ${ECBUILD_TRUST_FLAGS} )
+  set( ECBUILD_TRUST_FLAGS ON )
+  ecbuild_add_c_flags( "${ECBUILD_GPROF_FLAG}" )
+  ecbuild_add_cxx_flags( "${ECBUILD_GPROF_FLAG}" )
+  ecbuild_add_fortran_flags( "${ECBUILD_GPROF_FLAG}" )
+  set( ECBUILD_TRUST_FLAGS ${_trust_flags} )
+  unset( _trust_flags )
 
 endif()
 
@@ -278,6 +408,12 @@ if( UNIX )
 
   endif()
 
+  ### FreeBSD ###
+
+  if( ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" )
+    set( EC_OS_NAME "freebsd" )
+  endif()
+
   ### Solaris ###
 
   if( ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
diff --git a/cmake/ecbuild_compiler_flags.cmake b/cmake/ecbuild_compiler_flags.cmake
index a6c2944..139038b 100644
--- a/cmake/ecbuild_compiler_flags.cmake
+++ b/cmake/ecbuild_compiler_flags.cmake
@@ -18,18 +18,18 @@
 #
 # The procedure is as follows:
 #
-# 1.  ecBuild does *not* set ``CMAKE_<lang>_FLAGS`` i.e. the user can set these
-#     via -D or the CMake cache and these will be the "base" flags.
+# 1.  ecBuild does **not** set ``CMAKE_<lang>_FLAGS`` i.e. the user can set
+#     these via ``-D`` or the CMake cache and these will be the "base" flags.
 #
-# 2.  ecBuild *overwrites* ``CMAKE_<lang>_FLAGS_<btype>`` in the CMake cache
+# 2.  ecBuild **overwrites** ``CMAKE_<lang>_FLAGS_<btype>`` in the CMake cache
 #     for all build types with compiler specific defaults for the currently
-#     loaded compiler i.e. any value set by the user via -D or the CMake cache
-#     *has no effect*.
+#     loaded compiler i.e. any value set by the user via ``-D`` or the CMake
+#     cache **has no effect**.
 #
 # 3.  Any value the user provides via ``ECBUILD_<lang>_FLAGS`` or
-#     ``ECBUILD_<lang>_FLAGS_<btype>`` *overrides* the corresponding
-#     ``CMAKE_<lang>_FLAGS`` or ``CMAKE_<lang>_FLAGS_<btype>`` *without being
-#     written to the CMake cache*.
+#     ``ECBUILD_<lang>_FLAGS_<btype>`` **overrides** the corresponding
+#     ``CMAKE_<lang>_FLAGS`` or ``CMAKE_<lang>_FLAGS_<btype>`` **without being
+#     written to the CMake cache**.
 #
 ##############################################################################
 
diff --git a/cmake/ecbuild_config.h.in b/cmake/ecbuild_config.h.in
index 2eed359..1774847 100644
--- a/cmake/ecbuild_config.h.in
+++ b/cmake/ecbuild_config.h.in
@@ -44,6 +44,7 @@
 #cmakedefine EC_HAVE_FUNOPEN
 #cmakedefine EC_HAVE_FLOCK
 #cmakedefine EC_HAVE_MMAP
+#cmakedefine EC_HAVE_FOPENCOOKIE
 
 #cmakedefine EC_HAVE_POSIX_MEMALIGN
 
@@ -121,6 +122,7 @@
 #cmakedefine EC_HAVE_GETPWUID_R
 #cmakedefine EC_HAVE_GETPWNAM_R
 #cmakedefine EC_HAVE_READDIR_R
+#cmakedefine EC_HAVE_DIRENT_D_TYPE
 #cmakedefine EC_HAVE_GETHOSTBYNAME_R
 
 /* --- compiler __attribute__ support --- */
@@ -145,6 +147,7 @@
 
 #cmakedefine EC_HAVE_CXXABI_H
 #cmakedefine EC_HAVE_CXX_BOOL
+#cmakedefine EC_HAVE_CXX_INT_128
 
 #cmakedefine EC_HAVE_CXX_SSTREAM
 
diff --git a/cmake/ecbuild_declare_project.cmake b/cmake/ecbuild_declare_project.cmake
index e2f9cc8..b3f29e7 100644
--- a/cmake/ecbuild_declare_project.cmake
+++ b/cmake/ecbuild_declare_project.cmake
@@ -122,12 +122,11 @@ macro( ecbuild_declare_project )
   if( NOT INSTALL_INCLUDE_DIR )
     set( INSTALL_INCLUDE_DIR include )
   endif()
-  if( NOT INSTALL_DATA_DIR )
-    set( INSTALL_DATA_DIR share/${PROJECT_NAME} )
-  endif()
-  if( NOT INSTALL_CMAKE_DIR )
-    set( INSTALL_CMAKE_DIR share/${PROJECT_NAME}/cmake )
-  endif()
+  # INSTALL_DATA_DIR is package specific and needs to be reset for subpackages
+  # in a bundle. Users *cannot* override this directory (ECBUILD-315)
+  set( INSTALL_DATA_DIR share/${PROJECT_NAME} )
+  # share/${PROJECT_NAME}/cmake is a convention - it makes no sense to override it
+  set( INSTALL_CMAKE_DIR share/${PROJECT_NAME}/cmake )
 
   mark_as_advanced( INSTALL_BIN_DIR )
   mark_as_advanced( INSTALL_LIB_DIR )
@@ -135,15 +134,6 @@ macro( ecbuild_declare_project )
   mark_as_advanced( INSTALL_DATA_DIR )
   mark_as_advanced( INSTALL_CMAKE_DIR )
 
-  # overrides of install dirs (deprecated in ecBuild 2.4.0)
-
-  foreach( p LIB BIN INCLUDE DATA CMAKE )
-    if( ${PNAME}_INSTALL_${p}_DIR )
-      ecbuild_deprecate( "Use of ${PNAME}_INSTALL_${p}_DIR is deprecated and will be removed in a future release. Use INSTALL_${p}_DIR instead." )
-      set( INSTALL_${p}_DIR ${${PNAME}_INSTALL_${p}_DIR} )
-    endif()
-  endforeach()
-
   # warnings for non-relocatable projects
 
   foreach( p LIB BIN INCLUDE DATA CMAKE )
@@ -197,7 +187,7 @@ macro( ecbuild_declare_project )
 
   # print project header
 
-  message( STATUS "---------------------------------------------------------" )
+  ecbuild_info( "---------------------------------------------------------" )
 
   if( ${PNAME}_GIT_SHA1_SHORT )
     ecbuild_info( "[${PROJECT_NAME}] (${${PNAME}_VERSION_STR}) [${${PNAME}_GIT_SHA1_SHORT}]" )
diff --git a/cmake/ecbuild_define_options.cmake b/cmake/ecbuild_define_options.cmake
index fc6376e..cf5ff00 100644
--- a/cmake/ecbuild_define_options.cmake
+++ b/cmake/ecbuild_define_options.cmake
@@ -33,6 +33,12 @@ option( CHECK_UNUSED_FILES       "check for unused project files (slow)"  OFF )
 mark_as_advanced( DEVELOPER_MODE  )
 mark_as_advanced( CHECK_UNUSED_FILES  )
 
+option( ECBUILD_INSTALL_LIBRARY_HEADERS "Will install library headers" ON )
+mark_as_advanced( ECBUILD_INSTALL_LIBRARY_HEADERS )
+
+option( ECBUILD_INSTALL_FORTRAN_MODULES "Will install Fortran modules" ON )
+mark_as_advanced( ECBUILD_INSTALL_FORTRAN_MODULES )
+
 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)
diff --git a/cmake/ecbuild_define_paths.cmake b/cmake/ecbuild_define_paths.cmake
index c5e4830..16d7b94 100644
--- a/cmake/ecbuild_define_paths.cmake
+++ b/cmake/ecbuild_define_paths.cmake
@@ -23,14 +23,17 @@ set( CMAKE_SKIP_BUILD_RPATH              FALSE  )
 
 # If INSTALL_LIB_DIR is set to anything other than lib, the relative install
 # RPATH is wrong in the build tree
-if( ENABLE_RELATIVE_RPATHS AND (NOT INSTALL_LIB_DIR OR INSTALL_LIB_DIR STREQUAL "lib") )
-  # when building, use the install RPATH immediately (we don't want to relink)
-  set( CMAKE_BUILD_WITH_INSTALL_RPATH      TRUE  )
-  ecbuild_debug( "Building with install RPATH" )
-else()
-  # when building, don't use the install RPATH yet, but later on when installing
-  set( CMAKE_BUILD_WITH_INSTALL_RPATH      FALSE  )
-  ecbuild_debug( "Not building with install RPATH, need to relink when installing" )
+if( ENABLE_RELATIVE_RPATHS )
+  ecbuild_debug( "Relative RPATHS are enabled" )
+  if( INSTALL_LIB_DIR STREQUAL "lib" OR (NOT INSTALL_LIB_DIR) )
+    # when building, use the install RPATH immediately (we don't want to relink)
+    set( CMAKE_BUILD_WITH_INSTALL_RPATH      TRUE  )
+    ecbuild_debug( "Building with install RPATH" )
+  else()
+    # when building, don't use the install RPATH yet, but later on when installing
+    set( CMAKE_BUILD_WITH_INSTALL_RPATH      FALSE  )
+    ecbuild_debug( "Not building with install RPATH, need to relink when installing" )
+  endif()
 endif()
 
 # Always include srcdir and builddir in include path
diff --git a/cmake/ecbuild_find_fortranlibs.cmake b/cmake/ecbuild_find_fortranlibs.cmake
index 905d020..ac7cf25 100644
--- a/cmake/ecbuild_find_fortranlibs.cmake
+++ b/cmake/ecbuild_find_fortranlibs.cmake
@@ -30,6 +30,8 @@
 
 macro( ecbuild_find_fortranlibs )
 
+  ecbuild_deprecate( "ecbuild_find_fortranlibs is deprecated and will be removed in an upcoming ecBuild release" )
+
   # parse parameters
 
   set( options REQUIRED )
@@ -39,7 +41,7 @@ macro( ecbuild_find_fortranlibs )
   cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
 
   if(_PAR_UNPARSED_ARGUMENTS)
-    ecbuild_critical("Unknown keywords given to ecbuild_find_python(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+    ecbuild_critical("Unknown keywords given to ecbuild_find_fortranlibs(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
   endif()
 
   if( NOT FORTRANLIBS_FOUND ) # don't repeat search
diff --git a/cmake/ecbuild_find_omp.cmake b/cmake/ecbuild_find_omp.cmake
index ea9da24..3dc6fac 100644
--- a/cmake/ecbuild_find_omp.cmake
+++ b/cmake/ecbuild_find_omp.cmake
@@ -19,8 +19,8 @@ macro( lookup_omp_flags )
   set(_OMP_FLAG_XL         "-qsmp=omp")
   set(_OMPSTUBS_FLAG_XL    "-qsmp=noomp")
 
-  set(_OMP_FLAG_Intel      "-openmp")
-  set(_OMPSTUBS_FLAG_Intel "-openmp-stubs")
+  set(_OMP_FLAG_Intel      "-qopenmp")
+  set(_OMPSTUBS_FLAG_Intel "-qopenmp-stubs")
 
   # sample C openmp source code to test
   set(_OMP_C_TEST_SOURCE
@@ -155,7 +155,7 @@ macro( ecbuild_find_omp )
           check_cxx_source_compiles("${_SOURCE}" ${_FLAG} )
         endif()
         if( _LANG STREQUAL "Fortran" )
-          check_fortran_source_compiles("${_SOURCE}" ${_FLAG} )
+          check_fortran_source_compiles("${_SOURCE}" ${_FLAG} SRC_EXT f90)
         endif()
         set(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}")
       endif()
diff --git a/cmake/ecbuild_find_package.cmake b/cmake/ecbuild_find_package.cmake
index 71be044..3f5d72a 100644
--- a/cmake/ecbuild_find_package.cmake
+++ b/cmake/ecbuild_find_package.cmake
@@ -125,6 +125,10 @@ macro( ecbuild_find_package )
     ecbuild_critical("Call to ecbuild_find_package() requests EXACT but doesn't specify VERSION.")
   endif()
 
+  if( _PAR_QUIET )
+    set( _find_quiet QUIET )
+  endif()
+
   # If the package is required, set TYPE to REQUIRED
   # Due to shortcomings in CMake's argument parser, passing TYPE REQUIRED has no effect
   if( _PAR_REQUIRED )
@@ -193,8 +197,8 @@ macro( ecbuild_find_package )
 
   # search user defined paths first
 
-  if( ${_PAR_NAME}_PATH OR ${pkgUPPER}_PATH OR ${_PAR_NAME}_DIR )
-    ecbuild_debug("ecbuild_find_package(${_PAR_NAME}): ${_PAR_NAME}_PATH=${${_PAR_NAME}_PATH}, ${pkgUPPER}_PATH=${${pkgUPPER}_PATH}, ${_PAR_NAME}_DIR=${${_PAR_NAME}_DIR}")
+  if( ${_PAR_NAME}_PATH OR ${pkgUPPER}_PATH OR ${_PAR_NAME}_DIR OR ${_PAR_NAME}_BINARY_DIR )
+    ecbuild_debug("ecbuild_find_package(${_PAR_NAME}): ${_PAR_NAME}_PATH=${${_PAR_NAME}_PATH}, ${pkgUPPER}_PATH=${${pkgUPPER}_PATH}, ${_PAR_NAME}_DIR=${${_PAR_NAME}_DIR}, ${_PAR_NAME}_BINARY_DIR=${${_PAR_NAME}_BINARY_DIR}")
 
     # 1) search using CONFIG mode -- try to locate a configuration file provided by the package (package-config.cmake)
 
@@ -203,7 +207,7 @@ macro( ecbuild_find_package )
       ecbuild_debug("ecbuild_find_package(${_PAR_NAME}):    using hints ${pkgUPPER}_PATH=${${pkgUPPER}_PATH}, ${_PAR_NAME}_PATH=${${_PAR_NAME}_PATH}, ${_PAR_NAME}_DIR=${${_PAR_NAME}_DIR}")
       find_package( ${_PAR_NAME} ${_${pkgUPPER}_version} NO_MODULE ${_find_quiet}
         COMPONENTS ${_PAR_COMPONENTS}
-        HINTS ${${pkgUPPER}_PATH} ${${_PAR_NAME}_PATH} ${${_PAR_NAME}_DIR}
+        HINTS ${${pkgUPPER}_PATH} ${${_PAR_NAME}_PATH} ${${_PAR_NAME}_DIR} ${${_PAR_NAME}_BINARY_DIR}
         NO_DEFAULT_PATH )
     endif()
 
diff --git a/cmake/ecbuild_generate_rpc.cmake b/cmake/ecbuild_generate_rpc.cmake
index e475f19..2eb8605 100644
--- a/cmake/ecbuild_generate_rpc.cmake
+++ b/cmake/ecbuild_generate_rpc.cmake
@@ -3,8 +3,8 @@
 # This software is licensed under the terms of the Apache Licence Version 2.0
 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 # In applying this licence, ECMWF does not waive the privileges and immunities
-# granted to it by virtue of its status as an intergovernmental organisation nor
-# does it submit to any jurisdiction.
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
 
 ##############################################################################
 #.rst:
@@ -38,63 +38,61 @@
 
 macro( ecbuild_generate_rpc )
 
-    set( options )
-    set( single_value_args SOURCE TARGET_H TARGET_C )
-    set( multi_value_args DEPENDANT )
+  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} )
+  cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
 
-    if(_PAR_UNPARSED_ARGUMENTS)
-      ecbuild_critical("Unknown keywords given to ecbuild_generate_rpc(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
-    endif()
+  if(_PAR_UNPARSED_ARGUMENTS)
+    ecbuild_critical("Unknown keywords given to ecbuild_generate_rpc(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
+  endif()
 
-    if( NOT _PAR_SOURCE  )
-      ecbuild_critical("The call to ecbuild_generate_rpc() doesn't specify the SOURCE file.")
-    endif()
+  if( NOT _PAR_SOURCE  )
+    ecbuild_critical("The call to ecbuild_generate_rpc() doesn't specify the SOURCE file.")
+  endif()
 
-# optional
-#    if( NOT _PAR_DEPENDANT )
-#      ecbuild_critical("The call to ecbuild_generate_rpc() doesn't specify the DEPENDANT files.")
-#    endif()
+  # optional
+  #    if( NOT _PAR_DEPENDANT )
+  #      ecbuild_critical("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 )
-      ecbuild_critical("The call to ecbuild_generate_rpc() doesn't specify the _PAR_TARGET_H or _PAR_TARGET_C files.")
-    endif()
+  if( NOT DEFINED _PAR_TARGET_H AND NOT DEFINED _PAR_TARGET_C )
+    ecbuild_critical("The call to ecbuild_generate_rpc() doesn't specify the _PAR_TARGET_H or _PAR_TARGET_C files.")
+  endif()
 
-    find_package( RPCGEN REQUIRED )
+  find_package( RPCGEN REQUIRED )
 
-    if( DEFINED _PAR_TARGET_H )
+  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()
+    add_custom_command(
+      OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_H}
+      COMMAND ${RPCGEN_EXECUTABLE} -h -o ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_H} ${_PAR_SOURCE}
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+      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()
 
-    if( DEFINED _PAR_TARGET_C )
+  endif()
 
-        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_TARGET_C )
 
-      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()
+    add_custom_command(
+      OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_C}
+      COMMAND ${RPCGEN_EXECUTABLE} -c -o ${CMAKE_CURRENT_BINARY_DIR}/${_PAR_TARGET_C} ${_PAR_SOURCE}
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+      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/cmake/ecbuild_get_test_data.cmake b/cmake/ecbuild_get_test_data.cmake
index 37ea904..4945b90 100644
--- a/cmake/ecbuild_get_test_data.cmake
+++ b/cmake/ecbuild_get_test_data.cmake
@@ -47,7 +47,7 @@ function( _download_test_data _p_NAME _p_DIRNAME )
     if( WGET_PROGRAM )
 
       # wget takes the total number of tries, curl the number or retries
-      math( EXPR ECBUILD_DOWNLOAD_RETRIES ${ECBUILD_DOWNLOAD_RETRIES} + 1 )
+      math( EXPR ECBUILD_DOWNLOAD_RETRIES "${ECBUILD_DOWNLOAD_RETRIES} + 1" )
 
       add_custom_command( OUTPUT ${_p_NAME}
         COMMENT "(wget) downloading http://download.ecmwf.org/test-data/${_p_DIRNAME}/${_p_NAME}"
@@ -407,8 +407,13 @@ endfunction()\n\n" )
 
         # The option /fast disables dependency checking on a target, see
         # https://cmake.org/Wiki/CMake_FAQ#Is_there_a_way_to_skip_checking_of_dependent_libraries_when_compiling.3F
+        if( WIN32 )
+          set( _fast "\fast" )
+        else()
+          set( _fast "/fast" )
+        endif()
         file( APPEND ${_script}
-            "exec_check( \"${CMAKE_COMMAND}\" --build \"${CMAKE_BINARY_DIR}\" --target __get_data_${_p_TARGET}_${_name}/fast )\n" )
+              "exec_check( \"${CMAKE_COMMAND}\" --build \"${CMAKE_BINARY_DIR}\" --target __get_data_${_p_TARGET}_${_name}${_fast} )\n" )
 
     endforeach()
 
diff --git a/cmake/ecbuild_git.cmake b/cmake/ecbuild_git.cmake
index b2d38fa..18aab19 100644
--- a/cmake/ecbuild_git.cmake
+++ b/cmake/ecbuild_git.cmake
@@ -227,11 +227,13 @@ macro( ecbuild_git )
 
       if( DEFINED _PAR_BRANCH AND _PAR_UPDATE ) #############################################################################
 
-        execute_process( COMMAND "${GIT_EXECUTABLE}" pull -q
+        # Use git pull --ff-only, we WANT this to fail on upstream rebase and
+        # we DON'T want merge commits here!
+        execute_process( COMMAND "${GIT_EXECUTABLE}" pull -q --ff-only
                          RESULT_VARIABLE nok ERROR_VARIABLE error
                          WORKING_DIRECTORY "${ABS_PAR_DIR}")
         if(nok)
-          ecbuild_warn("git pull of branch ${_PAR_BRANCH} on ${_PAR_DIR} failed:\n ${error}")
+          ecbuild_critical("git pull of branch ${_PAR_BRANCH} on ${_PAR_DIR} failed:\n ${error}")
         endif()
 
       endif() ####################################################################################
diff --git a/cmake/ecbuild_install_project.cmake b/cmake/ecbuild_install_project.cmake
index ddba836..113e642 100644
--- a/cmake/ecbuild_install_project.cmake
+++ b/cmake/ecbuild_install_project.cmake
@@ -125,6 +125,8 @@ macro( ecbuild_install_project )
 
     ecbuild_set_if_not_defined(CPACK_PACKAGE_NAME      "${_PAR_NAME}")
     ecbuild_set_if_not_defined(CPACK_PACKAGE_VERSION   "${${PNAME}_VERSION_STR}")
+    # Convert "/" to "-" for the case where the version string contains a "/"
+    string( REPLACE "/" "-" CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION} )
 
     ecbuild_set_if_not_defined(CPACK_PACKAGE_FILE_NAME   "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
 
diff --git a/cmake/ecbuild_log.cmake b/cmake/ecbuild_log.cmake
index ca058fe..57ebf0d 100644
--- a/cmake/ecbuild_log.cmake
+++ b/cmake/ecbuild_log.cmake
@@ -121,7 +121,7 @@ endif()
 function( ecbuild_log LEVEL )
   string( REPLACE ";" " " MSG "${ARGN}" )
   string( TIMESTAMP _time )
-  file( APPEND ${ECBUILD_LOG_FILE} "${_time} - ${LEVEL} - ${MSG}\n" )
+  file( APPEND ${ECBUILD_LOG_FILE} "${_time} - ${PROJECT_NAME} - ${LEVEL} - ${MSG}\n" )
 endfunction( ecbuild_log )
 
 ##############################################################################
diff --git a/cmake/ecbuild_pkgconfig.cmake b/cmake/ecbuild_pkgconfig.cmake
index ed1076d..5ae273e 100644
--- a/cmake/ecbuild_pkgconfig.cmake
+++ b/cmake/ecbuild_pkgconfig.cmake
@@ -415,7 +415,7 @@ function( ecbuild_pkgconfig )
   ecbuild_info( "pkg-config file created: ${_PAR_FILENAME}" )
 
   install( FILES ${CMAKE_BINARY_DIR}/${_PAR_FILENAME}
-           DESTINATION ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIB_DIR}/pkgconfig/
+           DESTINATION ${INSTALL_LIB_DIR}/pkgconfig/
            COMPONENT utilities )
 
 endfunction(ecbuild_pkgconfig)
diff --git a/cmake/ecbuild_policies.cmake b/cmake/ecbuild_policies.cmake
index df2b40f..e24c435 100644
--- a/cmake/ecbuild_policies.cmake
+++ b/cmake/ecbuild_policies.cmake
@@ -18,9 +18,9 @@
 #
 ##############################################################################
 
-# allow for empty spaces around library names 
+# fail if empty spaces are found around linked library names
 if( POLICY CMP0004 )
-    cmake_policy( SET CMP0004 OLD )
+    cmake_policy( SET CMP0004 NEW )
 endif()
 
 # Allow use of the LOCATION target property.
@@ -65,3 +65,9 @@ endif()
 if( POLICY CMP0054 )
     cmake_policy( SET CMP0054 NEW )
 endif()
+
+# RPATH settings on macOS do not affect "install_name"
+# FTM, keep old behavior -- need to test if new behavior impacts binaries in build directory
+if( POLICY CMP0068 )
+    cmake_policy( SET CMP0068 OLD )
+endif()
diff --git a/cmake/ecbuild_remove_fortran_flags.cmake b/cmake/ecbuild_remove_fortran_flags.cmake
index 2a41f04..93aab17 100644
--- a/cmake/ecbuild_remove_fortran_flags.cmake
+++ b/cmake/ecbuild_remove_fortran_flags.cmake
@@ -36,7 +36,10 @@ macro( ecbuild_remove_fortran_flags m_flags )
     cmake_parse_arguments( _PAR "" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )
 
     string( TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_CAPS )
-    string( TOUPPER ${_PAR_BUILD} _PAR_BUILD_CAPS )
+
+    if( _PAR_BUILD )
+      string( TOUPPER ${_PAR_BUILD} _PAR_BUILD_CAPS )
+    endif()
 
     if( _PAR_BUILD AND (CMAKE_BUILD_TYPE_CAPS MATCHES "${_PAR_BUILD_CAPS}") )
 
@@ -48,6 +51,7 @@ macro( ecbuild_remove_fortran_flags m_flags )
     elseif( NOT _PAR_BUILD )
 
       foreach( _flag ${_flags} )
+        string(REGEX REPLACE " *${_flag} *" " " CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE_CAPS} ${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE_CAPS}} )
         string(REGEX REPLACE " *${_flag} *" " " CMAKE_Fortran_FLAGS ${CMAKE_Fortran_FLAGS} )
         ecbuild_debug( "Fortran FLAG [${_flag}] removed" )
       endforeach()
diff --git a/cmake/ecbuild_setup_test_framework.cmake b/cmake/ecbuild_setup_test_framework.cmake
index c14b2f9..b4b3ccb 100644
--- a/cmake/ecbuild_setup_test_framework.cmake
+++ b/cmake/ecbuild_setup_test_framework.cmake
@@ -40,6 +40,33 @@ if( ENABLE_TESTS AND CMAKE_CXX_COMPILER_LOADED )
 
 endif()
 
-if( NOT ENABLE_TESTS )
+if( ENABLE_TESTS )
+
+  # CTest has built-in support for running with memcheck
+  # (https://cmake.org/cmake/help/latest/manual/ctest.1.html#ctest-memcheck-step)
+  # via `ctest -T memcheck`, however by default memcheck does not exit with a
+  # non-zero error code if any issues are found.
+  #
+  # CTest will run ${MEMORYCHECK_COMMAND} with ${MEMORYCHECK_COMMAND_OPTIONS}.
+  # Suppressions are read from ${MEMORYCHECK_SUPPRESSIONS_FILE} if given.
+
+  find_program( MEMORYCHECK_COMMAND valgrind )
+  ecbuild_debug_var( MEMORYCHECK_COMMAND )
+
+  if( NOT MEMORYCHECK_COMMAND_OPTIONS )
+    set( MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full --error-exitcode=1"
+         CACHE STRING "Options passed to memcheck command" )
+  endif()
+  ecbuild_debug_var( MEMORYCHECK_COMMAND_OPTIONS )
+
+  if( NOT MEMORYCHECK_SUPPRESSIONS_FILE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/valgrind_suppress.txt" )
+    set( MEMORYCHECK_SUPPRESSIONS_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.supp"
+         CACHE FILEPATH "Suppressions file to be used with memcheck command" )
+  endif()
+  ecbuild_debug_var( MEMORYCHECK_SUPPRESSIONS_FILE )
+
+else()
+
   ecbuild_info("Tests have been disabled")
+
 endif()
diff --git a/cmake/ecbuild_system.cmake b/cmake/ecbuild_system.cmake
index 10af0c8..b3a6c6b 100644
--- a/cmake/ecbuild_system.cmake
+++ b/cmake/ecbuild_system.cmake
@@ -102,12 +102,6 @@ if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
     # 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} )
-
     ############################################################################################
     # define valid build types
 
@@ -169,6 +163,7 @@ if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
     include( ecbuild_list_add_pattern )
     include( ecbuild_list_exclude_pattern )
 
+    include( ecbuild_try_run )
     include( ecbuild_check_c_source_return )
     include( ecbuild_check_cxx_source_return )
     include( ecbuild_check_cxx11 )
@@ -249,6 +244,15 @@ if( PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME )
     ecbuild_flush_cache()
 
     ############################################################################################
+    # Testing
+
+    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} )
+
+    ############################################################################################
     # define the build timestamp, unless the user provided one via EC_BUILD_TIMESTAMP
 
     if( NOT DEFINED EC_BUILD_TIMESTAMP )
diff --git a/cmake/ecbuild_try_run.cmake b/cmake/ecbuild_try_run.cmake
new file mode 100644
index 0000000..854f1d1
--- /dev/null
+++ b/cmake/ecbuild_try_run.cmake
@@ -0,0 +1,200 @@
+# (C) Copyright 1996-2017 ECMWF.
+#
+# This software is licensed under the terms of the Apache Licence Version 2.0
+# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+# In applying this licence, ECMWF does not waive the privileges and immunities
+# granted to it by virtue of its status as an intergovernmental organisation
+# nor does it submit to any jurisdiction.
+
+##############################################################################
+#.rst:
+#
+# ecbuild_try_run
+# ===============
+#
+# Try compiling and then running some code. ::
+#
+#   ecbuild_try_run( <run_result_var> <compile_result_var>
+#                    <bindir> <srcfile>
+#                    [ CMAKE_FLAGS <flag> [ <flag> ... ] ]
+#                    [ COMPILE_DEFINITIONS <def> [ <def> ... ] ]
+#                    [ LINK_LIBRARIES <lib> [ <lib> ... ] ]
+#                    [ COMPILE_OUTPUT_VARIABLE <var> ]
+#                    [ RUN_OUTPUT_VARIABLE <var> ]
+#                    [ OUTPUT_VARIABLE <var> ]
+#                    [ ARGS <arg> [ <arg> ... ] ] )
+#
+# Try compiling a ``<srcfile>``.  Returns ``TRUE`` or ``FALSE`` for success
+# or failure in ``<compile_result_var>``.  If the compile succeeded, runs the
+# executable and returns its exit code in ``<run_result_var>``.  If the
+# executable was built, but failed to run, then ``<run_result_var>`` will be
+# set to ``FAILED_TO_RUN``.  See the CMake ``try_compile`` command for
+# information on how the test project is constructed to build the source file.
+#
+# Options
+# -------
+#
+# CMAKE_FLAGS : optional
+#   Specify flags of the form ``-DVAR:TYPE=VALUE`` to be passed to
+#   the ``cmake`` command-line used to drive the test build.
+#
+#   The example in CMake's ``try_compile`` shows how values for variables
+#   ``INCLUDE_DIRECTORIES``, ``LINK_DIRECTORIES``, and ``LINK_LIBRARIES``
+#   are used.
+#
+# COMPILE_DEFINITIONS : optional
+#   Specify ``-Ddefinition`` arguments to pass to ``add_definitions``
+#   in the generated test project.
+#
+# COMPILE_OUTPUT_VARIABLE : optional
+#   Report the compile step build output in a given variable.
+#
+# LINK_LIBRARIES : optional
+#   Specify libraries to be linked in the generated project.
+#   The list of libraries may refer to system libraries and to
+#   Imported Targets from the calling project.
+#
+#   If this option is specified, any ``-DLINK_LIBRARIES=...`` value
+#   given to the ``CMAKE_FLAGS`` option will be ignored.
+#
+# OUTPUT_VARIABLE : optional
+#   Report the compile build output and the output from running the executable
+#   in the given variable.  This option exists for legacy reasons.  Prefer
+#   ``COMPILE_OUTPUT_VARIABLE`` and ``RUN_OUTPUT_VARIABLE`` instead.
+#
+# RUN_OUTPUT_VARIABLE : optional
+#   Report the output from running the executable in a given variable.
+#
+# Other Behavior Settings
+# -----------------------
+#
+# Set the ``CMAKE_TRY_COMPILE_CONFIGURATION`` variable to choose
+# a build configuration.
+#
+# Behavior when Cross Compiling
+# -----------------------------
+#
+# When cross compiling, the executable compiled in the first step
+# usually cannot be run on the build host.  The ``try_run`` command checks
+# the ``CMAKE_CROSSCOMPILING`` variable to detect whether CMake is in
+# cross-compiling mode.  If that is the case, it will still try to compile
+# the executable, but it will not try to run the executable unless the
+# ``CMAKE_CROSSCOMPILING_EMULATOR`` variable is set.  Instead it will create
+# cache variables which must be filled by the user or by presetting them in
+# some CMake script file to the values the executable would have produced if
+# it had been run on its actual target platform. These cache entries are:
+#
+# ``<RUN_RESULT_VAR>``
+#   Exit code if the executable were to be run on the target platform.
+#
+# ``<RUN_RESULT_VAR>__TRYRUN_OUTPUT``
+#   Output from stdout and stderr if the executable were to be run on
+#   the target platform.  This is created only if the
+#   ``RUN_OUTPUT_VARIABLE`` or ``OUTPUT_VARIABLE`` option was used.
+#
+# In order to make cross compiling your project easier, use ``try_run``
+# only if really required.  If you use ``try_run``, use the
+# ``RUN_OUTPUT_VARIABLE`` or ``OUTPUT_VARIABLE`` options only if really
+# required.  Using them will require that when cross-compiling, the cache
+# variables will have to be set manually to the output of the executable.
+# You can also "guard" the calls to ``try_run`` with an ``if`` block checking
+# the ``CMAKE_CROSSCOMPILING`` variable and provide an easy-to-preset
+# alternative for this case.
+#
+##############################################################################
+
+# This is an API compatible version of try_run which ignores output on stderr
+
+if( CMAKE_VERSION VERSION_LESS 2.8.12 )
+
+ecbuild_deprecate( "ecbuild_try_run falls back to try_run on CMake < 2.8.12 (ECBUILD-341)" )
+
+macro( ecbuild_try_run )
+  try_run( ${ARGV} )
+endmacro()
+
+else()
+
+function( ecbuild_try_run RUN_RESULT_VAR COMPILE_RESULT_VAR BINDIR SRCFILE )
+
+  set( options )
+  set( single_value_args COMPILE_OUTPUT_VARIABLE RUN_OUTPUT_VARIABLE OUTPUT_VARIABLE )
+  set( multi_value_args  CMAKE_FLAGS COMPILE_DEFINITIONS LINK_LIBRARIES ARGS )
+
+  cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
+
+  if( _p_UNPARSED_ARGUMENTS )
+    ecbuild_critical("Unknown keywords given to ecbuild_try_run(): \"${_p_UNPARSED_ARGUMENTS}\"")
+  endif()
+
+  # Build argument list for try_compile
+  foreach( _opt CMAKE_FLAGS COMPILE_DEFINITIONS LINK_LIBRARIES  )
+    if( _p_${_opt} )
+      list( APPEND _opts ${_opt} "${_p_${_opt}}" )
+    endif()
+  endforeach()
+
+  ecbuild_debug( "ecbuild_try_run: Compiling ${SRCFILE} in ${BINDIR}" )
+  try_compile( _compile_res ${BINDIR} ${SRCFILE}
+               OUTPUT_VARIABLE _compile_out
+               COPY_FILE ${SRCFILE}.bin COPY_FILE_ERROR _compile_err
+               ${_opts} )
+
+  if( _compile_out )
+    ecbuild_debug( "ecbuild_try_run: compilation output"
+      "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+      "\n${_compile_out}"
+      "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" )
+  endif()
+  if( _compile_err )
+    ecbuild_debug( "ecbuild_try_run: compilation errors"
+      "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+      "\n${_compile_err}"
+      "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" )
+  endif()
+
+  # FIXME: how do we handle cross compilation mode? (CMAKE_CROSSCOMPILING)
+
+  if( _compile_res )
+
+    ecbuild_debug( "ecbuild_try_run: Running ${SRCFILE}.bin in ${BINDIR}" )
+    execute_process( COMMAND ${SRCFILE}.bin WORKING_DIRECTORY ${BINDIR}
+                     RESULT_VARIABLE _run_res
+                     OUTPUT_VARIABLE _run_out ERROR_VARIABLE _run_err )
+
+    if( _p_RUN_OUTPUT_VARIABLE )
+      set( ${_p_RUN_OUTPUT_VARIABLE} ${_run_out} )
+    endif()
+    if( _run_out )
+      ecbuild_debug( "ecbuild_try_run: run output"
+        "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+        "\n${_run_out}"
+        "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" )
+    endif()
+    if( _run_err )
+      ecbuild_debug( "ecbuild_try_run: run errors"
+        "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
+        "\n${_run_err}"
+        "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" )
+    endif()
+
+  else()
+    set( ${RUN_RESULT_VAR} "FAILED_TO_RUN" PARENT_SCOPE )
+    ecbuild_debug( "ecbuild_try_run: Compilation of ${SRCFILE} in ${BINDIR} failed!" )
+  endif()
+
+  set( ${COMPILE_RESULT_VAR} ${_compile_res} PARENT_SCOPE )
+  set( ${RUN_RESULT_VAR} ${_run_res} PARENT_SCOPE )
+  if( _p_COMPILE_OUTPUT_VARIABLE )
+    set( ${_p_COMPILE_OUTPUT_VARIABLE} ${_compile_out} PARENT_SCOPE )
+  endif()
+  if( _p_RUN_OUTPUT_VARIABLE )
+    set( ${_p_RUN_OUTPUT_VARIABLE} ${_run_out} PARENT_SCOPE )
+  endif()
+  if( _p_OUTPUT_VARIABLE )
+    set( ${_p_OUTPUT_VARIABLE} "${_compile_out}\n${_run_out}" PARENT_SCOPE )
+  endif()
+
+endfunction()
+
+endif()
diff --git a/cmake/ecbuild_uninstall.cmake.in b/cmake/ecbuild_uninstall.cmake.in
index 2037e36..33b1949 100644
--- a/cmake/ecbuild_uninstall.cmake.in
+++ b/cmake/ecbuild_uninstall.cmake.in
@@ -1,9 +1,16 @@
 if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
   message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
-endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+endif()
 
 file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
 string(REGEX REPLACE "\n" ";" files "${files}")
+
+if(EXISTS "@CMAKE_CURRENT_BINARY_DIR@/extra_install.txt")
+  file(READ "@CMAKE_CURRENT_BINARY_DIR@/extra_install.txt" __files)
+  string(REGEX REPLACE "\n" ";" __files "${__files}")
+  list(APPEND files ${__files})
+endif()
+
 foreach(file ${files})
   message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
   if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
@@ -14,8 +21,8 @@ foreach(file ${files})
       )
     if(NOT "${rm_retval}" STREQUAL 0)
       message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
-    endif(NOT "${rm_retval}" STREQUAL 0)
-  else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
+    endif()
+  else()
     message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
-  endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
+  endif()
 endforeach(file)
diff --git a/cmake/ecbuild_use_package.cmake b/cmake/ecbuild_use_package.cmake
index d54e459..43546f8 100644
--- a/cmake/ecbuild_use_package.cmake
+++ b/cmake/ecbuild_use_package.cmake
@@ -162,7 +162,6 @@ macro( ecbuild_use_package )
 
   # check if was already added as subproject ...
 
-  set( _just_added 0 )
   set( _do_version_check 0 )
   set( _source_description "" )
 
@@ -170,10 +169,8 @@ macro( ecbuild_use_package )
 
   if( NOT _ecbuild_project_${pkgUPPER} EQUAL "-1" )
     ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): ${_p_PROJECT} was previously added as a subproject")
-    set( ${pkgUPPER}_previous_subproj_ 1 )
   else()
     ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): ${_p_PROJECT} was not previously added as a subproject")
-    set( ${pkgUPPER}_previous_subproj_ 0 )
   endif()
 
   # solve capitalization issues
@@ -185,26 +182,31 @@ macro( ecbuild_use_package )
     set( ${_p_PROJECT}_FOUND 1 )
   endif()
 
-  # Case 1) project was NOT previously added as subproject and is NOT already FOUND
+  # Case 1) project exists as subproject
 
-  if( NOT ${pkgUPPER}_FOUND AND NOT ${pkgUPPER}_previous_subproj_ )
+  if( DEFINED ${pkgUPPER}_subproj_dir_ )
 
-    # check if SUBPROJDIR is set
+    # check version is acceptable
+    set( _do_version_check 1 )
+
+    # Case 1a) project was already found
+
+    if( ${pkgUPPER}_FOUND )
+
+      ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 1a) project was already added as subproject, check version is acceptable")
 
-    if( DEFINED ${pkgUPPER}_subproj_dir_ )
+      set( _source_description "already existing sub-project ${_p_PROJECT} (sources)" )
 
-      ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 1) project was NOT previously added as subproject and is NOT already FOUND")
+    # Case 1b) project was not already found
+
+    else()
+
+      ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 1b) project is NOT already FOUND and exists as subproject")
 
-      # 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( ${pkgUPPER}_subproj_dir_ ${${pkgUPPER}_subproj_dir_} CACHE PATH "Path to ${_p_PROJECT} source directory" )
-      mark_as_advanced( ${pkgUPPER}_subproj_dir_ )
-
       set( ECBUILD_PROJECTS ${ECBUILD_PROJECTS} ${_p_PROJECT} CACHE INTERNAL "" )
 
       ecbuild_debug("ecbuild_use_package(${_p_PROJECT}):    ${_p_PROJECT} found in subdirectory ${${pkgUPPER}_subproj_dir_}")
@@ -221,27 +223,12 @@ macro( ecbuild_use_package )
 
   endif()
 
-  # Case 2) project was already added as subproject, so is already FOUND -- BUT must check version acceptable
-
-  if( ${pkgUPPER}_previous_subproj_ )
-
-    ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 2) project was already added as subproject, check version is acceptable")
-
-    if( NOT ${pkgUPPER}_FOUND )
-      ecbuild_critical( "${_p_PROJECT} was already included as sub-project but ${pkgUPPER}_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 )
+  # Case 2) project does NOT exist as subproject, but is FOUND
+  #   it was previously found as a binary ( either build or install tree )
 
-  if( ${pkgUPPER}_FOUND AND NOT ${pkgUPPER}_previous_subproj_ AND NOT _just_added )
+  if( ${pkgUPPER}_FOUND AND NOT ${pkgUPPER}_subproj_dir_ )
 
-    ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 3) project was NOT previously added as subproject, but is FOUND")
+    ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 2) project does NOT exist as subproject, but is FOUND")
 
     # check version is acceptable
     set( _do_version_check 1 )
@@ -255,7 +242,6 @@ macro( ecbuild_use_package )
   # ecbuild_debug_var( _p_VERSION )
   # ecbuild_debug_var( ${pkgUPPER}_VERSION )
   # ecbuild_debug_var( ${_p_PROJECT}_VERSION )
-  # ecbuild_debug_var( _just_added )
   # ecbuild_debug_var( _do_version_check )
   # ecbuild_debug_var( _source_description )
   # ecbuild_debug_var( ${pkgUPPER}_FOUND )
@@ -275,7 +261,7 @@ macro( ecbuild_use_package )
     endif()
   endif()
 
-  # Case 4) is NOT FOUND so far, NOT as sub-project (now or before), and NOT as binary neither
+  # Case 3) 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( ${pkgUPPER}_FOUND )
@@ -289,7 +275,7 @@ macro( ecbuild_use_package )
                             PURPOSE "${_p_PURPOSE}" )
   else()
 
-    ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 4) project has NOT been added as a subproject and is NOT already FOUND")
+    ecbuild_debug("ecbuild_use_package(${_p_PROJECT}): 3) project does NOT exist as subproject and is NOT already FOUND")
 
     set( _opts )
     if( _p_VERSION )
diff --git a/cmake/fortran_features/CheckFortranFeatures.cmake b/cmake/fortran_features/CheckFortranFeatures.cmake
index 992964f..f9fd6e1 100644
--- a/cmake/fortran_features/CheckFortranFeatures.cmake
+++ b/cmake/fortran_features/CheckFortranFeatures.cmake
@@ -25,7 +25,7 @@ MACRO(fortran_check_single_feature FEATURE_NAME FEATURE_NUMBER RESULT_VAR)
         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
+      ecbuild_try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
           "${_bindir}" "${_SRCFILE}")
       IF (_COMPILE_RESULT_VAR AND NOT _RUN_RESULT_VAR)
         SET(${RESULT_VAR} TRUE)
@@ -33,7 +33,7 @@ MACRO(fortran_check_single_feature FEATURE_NAME FEATURE_NUMBER 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
+        ecbuild_try_run(_RUN_RESULT_VAR _COMPILE_RESULT_VAR
             "${_bindir}_fail" "${_SRCFILE_FAIL}")
         IF (_COMPILE_RESULT_VAR AND _RUN_RESULT_VAR)
           SET(${RESULT_VAR} TRUE)
diff --git a/cmake/project-config.cmake.in b/cmake/project-config.cmake.in
index 6d48728..0e1e83b 100644
--- a/cmake/project-config.cmake.in
+++ b/cmake/project-config.cmake.in
@@ -75,7 +75,7 @@ if( NOT @PROJECT_NAME at _BINARY_DIR )
   if( @PNAME at _IS_BUILD_DIR_EXPORT )
     include( "@TOP_PROJECT_TARGETS_FILE@" OPTIONAL )
   else()
-    include( "${@PNAME at _CMAKE_DIR}/@PROJECT_NAME at -targets.cmake" )
+    include( "${@PNAME at _CMAKE_DIR}/@PROJECT_NAME at -targets.cmake" OPTIONAL )
   endif()
 
 endif()
diff --git a/cmake/sg.pl b/cmake/sg.pl
index f8c8e31..c856ef3 100644
--- a/cmake/sg.pl
+++ b/cmake/sg.pl
@@ -1,5 +1,4 @@
-#!/usr/bin/perl
-#!/usr/local/share/perl56
+#!/usr/bin/env perl
 
 # (C) Copyright 1996-2017 ECMWF.
 # 
@@ -569,5 +568,3 @@ sub template {
 	return $self->{template} ? @{$self->{template}} : ();
 }
 1;
-
-
diff --git a/install.sh b/install.sh
index 1492279..cf2dddb 100755
--- a/install.sh
+++ b/install.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 # ==================================================================
-# Error handling
+# Error handlings
 set -e # stop the shell on first error
 set -u # fail when using an undefined variable
 
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake b/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
index e3ef29c..8ad7ac8 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
+++ b/share/ecbuild/toolchains/ecmwf-XC30-Cray.cmake
@@ -1,7 +1,102 @@
 ####################################################################
 # ARCHITECTURE
 ####################################################################
+
+set( EC_HAVE_C_INLINE 1 )
+set( EC_HAVE_FUNCTION_DEF 1 )
+set( EC_HAVE_CXXABI_H 1 )
+set( EC_HAVE_CXX_BOOL 1 )
+set( EC_HAVE_CXX_SSTREAM 1 )
+set( EC_HAVE_CXX_INT_128 0 )
 set( CMAKE_SIZEOF_VOID_P 8 )
+set( EC_SIZEOF_PTR 8 )
+set( EC_SIZEOF_CHAR 1 )
+set( EC_SIZEOF_SHORT 2 )
+set( EC_SIZEOF_INT 4 )
+set( EC_SIZEOF_LONG 8 )
+set( EC_SIZEOF_LONG_LONG 8 )
+set( EC_SIZEOF_FLOAT 4 )
+set( EC_SIZEOF_DOUBLE 8 )
+set( EC_SIZEOF_LONG_DOUBLE 8 )
+set( EC_SIZEOF_SIZE_T 8 )
+set( EC_SIZEOF_SSIZE_T 8 )
+set( EC_SIZEOF_OFF_T 8 )
+set( EC_SIZEOF_OFF_T 8 )
+set( EC_BIG_ENDIAN 0 )
+set( EC_LITTLE_ENDIAN 1 )
+set( IEEE_BE 0 )
+set( IEEE_LE 1 )
+set( EC_HAVE_FSEEK 1 )
+set( EC_HAVE_FSEEKO 1 )
+set( EC_HAVE_FTELLO 1 )
+set( EC_HAVE_LSEEK 0 )
+set( EC_HAVE_FTRUNCATE 0 )
+set( EC_HAVE_OPEN 0 )
+set( EC_HAVE_FOPEN 1 )
+set( EC_HAVE_FMEMOPEN 1 )
+set( EC_HAVE_FUNOPEN 0 )
+set( EC_HAVE_FLOCK 1 )
+set( EC_HAVE_MMAP 1 )
+set( EC_HAVE_POSIX_MEMALIGN 1 )
+set( EC_HAVE_F_GETLK 1 )
+set( EC_HAVE_F_SETLK 1 )
+set( EC_HAVE_F_SETLKW 1 )
+set( EC_HAVE_F_GETLK64 1 )
+set( EC_HAVE_F_SETLK64 1 )
+set( EC_HAVE_F_SETLKW64 1 )
+set( EC_HAVE_MAP_ANONYMOUS 1 )
+set( EC_HAVE_MAP_ANON 1 )
+set( EC_HAVE_ASSERT_H 1 )
+set( EC_HAVE_STDLIB_H 1 )
+set( EC_HAVE_UNISTD_H 1 )
+set( EC_HAVE_STRING_H 1 )
+set( EC_HAVE_STRINGS_H 1 )
+set( EC_HAVE_SYS_STAT_H 1 )
+set( EC_HAVE_SYS_TIME_H 1 )
+set( EC_HAVE_SYS_TYPES_H 1 )
+set( EC_HAVE_MALLOC_H 1 )
+set( EC_HAVE_SYS_MALLOC_H 0 )
+set( EC_HAVE_SYS_PARAM_H 1 )
+set( EC_HAVE_SYS_MOUNT_H 1 )
+set( EC_HAVE_SYS_VFS_H 1 )
+set( EC_HAVE_OFFT 1 )
+set( EC_HAVE_OFF64T 1 )
+set( EC_HAVE_STRUCT_STAT 1 )
+set( EC_HAVE_STRUCT_STAT64 1 )
+set( EC_HAVE_STAT 1 )
+set( EC_HAVE_STAT64 1 )
+set( EC_HAVE_FSTAT 1 )
+set( EC_HAVE_FSTAT64 1 )
+set( EC_HAVE_FSEEKO64 1 )
+set( EC_HAVE_FTELLO64 1 )
+set( EC_HAVE_LSEEK64 1 )
+set( EC_HAVE_OPEN64 1 )
+set( EC_HAVE_FOPEN64 1 )
+set( EC_HAVE_FTRUNCATE64 1 )
+set( EC_HAVE_FLOCK64 1 )
+set( EC_HAVE_MMAP64 1 )
+set( EC_HAVE_STRUCT_STATVFS 1 )
+set( EC_HAVE_STRUCT_STATVFS64 1 )
+set( EC_HAVE_FOPENCOOKIE 1 )
+set( EC_HAVE_FSYNC 1 )
+set( EC_HAVE_FDATASYNC 1 )
+set( EC_HAVE_DIRFD 1 )
+set( EC_HAVE_SYSPROC 0 )
+set( EC_HAVE_SYSPROCFS 1 )
+set( EC_HAVE_EXECINFO_BACKTRACE 1 )
+set( EC_HAVE_GMTIME_R 1 )
+set( EC_HAVE_GETPWUID_R 1 )
+set( EC_HAVE_GETPWNAM_R 1 )
+set( EC_HAVE_READDIR_R 1 )
+set( EC_HAVE_DIRENT_D_TYPE 1 )
+set( EC_HAVE_GETHOSTBYNAME_R 1 )
+set( EC_HAVE_ATTRIBUTE_CONSTRUCTOR 1 )
+set( EC_ATTRIBUTE_CONSTRUCTOR_INITS_ARGV 0 )
+set( EC_HAVE_PROCFS 1 )
+set( EC_HAVE_DLFCN_H 1 )
+set( EC_HAVE_DLADDR 1 )
+set( EC_HAVE_AIOCB 1 )
+set( EC_HAVE_AIOCB64 1 )
 
 # Disable relative rpaths as aprun does not respect it
 set( ENABLE_RELATIVE_RPATHS OFF CACHE STRING "Disable relative rpaths" FORCE )
@@ -19,6 +114,8 @@ CMAKE_FORCE_Fortran_COMPILER ( ftn Cray )
 set( ECBUILD_FIND_MPI OFF )
 set( ECBUILD_TRUST_FLAGS ON )
 
+set( CXX11_FLAG "-hstd=c++11" )
+
 ####################################################################
 # OpenMP FLAGS
 ####################################################################
@@ -35,10 +132,16 @@ set( OMPSTUBS_Fortran_FLAGS  "-hnoomp" )
 # LINK FLAGS
 ####################################################################
 
+if( EXISTS "$ENV{CC_X86_64}/lib/x86-64/libcray-c++-rts.so" )
+  set( LIBCRAY_CXX_RTS "$ENV{CC_X86_64}/lib/x86-64/libcray-c++-rts.so" ) 
+elseif( EXISTS "$ENV{CC_X86_64}/lib/libcray-c++-rts.so" )
+  set( LIBCRAY_CXX_RTS "$ENV{CC_X86_64}/lib/libcray-c++-rts.so" ) 
+endif()
+
 set( ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr -Ktrap=fp" )
 set( ECBUILD_MODULE_LINKER_FLAGS "-Wl,--eh-frame-hdr -Ktrap=fp -Wl,-Map,loadmap" )
 set( ECBUILD_EXE_LINKER_FLAGS    "-Wl,--eh-frame-hdr -Ktrap=fp -Wl,-Map,loadmap -Wl,--as-needed" )
-set( ECBUILD_CXX_IMPLICIT_LINK_LIBRARIES "$ENV{CC_X86_64}/lib/x86-64/libcray-c++-rts.so" CACHE STRING "" )
+set( ECBUILD_CXX_IMPLICIT_LINK_LIBRARIES "${LIBCRAY_CXX_RTS}" CACHE STRING "" )
 
 ####################################################################
 # LIBRARIES
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake b/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake
index 84dbd7b..d98fe29 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake
+++ b/share/ecbuild/toolchains/ecmwf-XC30-GNU.cmake
@@ -1,7 +1,100 @@
 ####################################################################
 # ARCHITECTURE
 ####################################################################
+
+set( EC_HAVE_C_INLINE 1 )
+set( EC_HAVE_FUNCTION_DEF 1 )
+set( EC_HAVE_CXXABI_H 1 )
+set( EC_HAVE_CXX_BOOL 1 )
+set( EC_HAVE_CXX_SSTREAM 1 )
+set( EC_HAVE_CXX_INT_128 1 )
 set( CMAKE_SIZEOF_VOID_P 8 )
+set( EC_SIZEOF_PTR 8 )
+set( EC_SIZEOF_CHAR 1 )
+set( EC_SIZEOF_SHORT 2 )
+set( EC_SIZEOF_INT 4 )
+set( EC_SIZEOF_LONG 8 )
+set( EC_SIZEOF_LONG_LONG 8 )
+set( EC_SIZEOF_FLOAT 4 )
+set( EC_SIZEOF_DOUBLE 8 )
+set( EC_SIZEOF_LONG_DOUBLE 16 )
+set( EC_SIZEOF_SIZE_T 8 )
+set( EC_SIZEOF_SSIZE_T 8 )
+set( EC_SIZEOF_OFF_T 8 )
+set( EC_SIZEOF_OFF_T 8 )
+set( EC_BIG_ENDIAN 0 )
+set( EC_LITTLE_ENDIAN 1 )
+set( IEEE_BE 0 )
+set( IEEE_LE 1 )
+set( EC_HAVE_FSEEK 1 )
+set( EC_HAVE_FSEEKO 1 )
+set( EC_HAVE_FTELLO 1 )
+set( EC_HAVE_LSEEK 0 )
+set( EC_HAVE_FTRUNCATE 0 )
+set( EC_HAVE_OPEN 0 )
+set( EC_HAVE_FOPEN 1 )
+set( EC_HAVE_FMEMOPEN 1 )
+set( EC_HAVE_FUNOPEN 0 )
+set( EC_HAVE_FLOCK 1 )
+set( EC_HAVE_MMAP 1 )
+set( EC_HAVE_POSIX_MEMALIGN 1 )
+set( EC_HAVE_F_GETLK 1 )
+set( EC_HAVE_F_SETLK 1 )
+set( EC_HAVE_F_SETLKW 1 )
+set( EC_HAVE_F_GETLK64 1 )
+set( EC_HAVE_F_SETLK64 1 )
+set( EC_HAVE_F_SETLKW64 1 )
+set( EC_HAVE_MAP_ANONYMOUS 1 )
+set( EC_HAVE_MAP_ANON 1 )
+set( EC_HAVE_ASSERT_H 1 )
+set( EC_HAVE_STDLIB_H 1 )
+set( EC_HAVE_UNISTD_H 1 )
+set( EC_HAVE_STRING_H 1 )
+set( EC_HAVE_STRINGS_H 1 )
+set( EC_HAVE_SYS_STAT_H 1 )
+set( EC_HAVE_SYS_TIME_H 1 )
+set( EC_HAVE_SYS_TYPES_H 1 )
+set( EC_HAVE_MALLOC_H 1 )
+set( EC_HAVE_SYS_MALLOC_H 0 )
+set( EC_HAVE_SYS_PARAM_H 1 )
+set( EC_HAVE_SYS_MOUNT_H 1 )
+set( EC_HAVE_SYS_VFS_H 1 )
+set( EC_HAVE_OFFT 1 )
+set( EC_HAVE_OFF64T 1 )
+set( EC_HAVE_STRUCT_STAT 1 )
+set( EC_HAVE_STRUCT_STAT64 1 )
+set( EC_HAVE_STAT 1 )
+set( EC_HAVE_STAT64 1 )
+set( EC_HAVE_FSTAT 1 )
+set( EC_HAVE_FSTAT64 1 )
+set( EC_HAVE_FSEEKO64 1 )
+set( EC_HAVE_FTELLO64 1 )
+set( EC_HAVE_LSEEK64 1 )
+set( EC_HAVE_OPEN64 1 )
+set( EC_HAVE_FOPEN64 1 )
+set( EC_HAVE_FTRUNCATE64 1 )
+set( EC_HAVE_FLOCK64 1 )
+set( EC_HAVE_MMAP64 1 )
+set( EC_HAVE_STRUCT_STATVFS 1 )
+set( EC_HAVE_STRUCT_STATVFS64 1 )
+set( EC_HAVE_FOPENCOOKIE 1 )
+set( EC_HAVE_FSYNC 1 )
+set( EC_HAVE_FDATASYNC 1 )
+set( EC_HAVE_DIRFD 1 )
+set( EC_HAVE_SYSPROC 0 )
+set( EC_HAVE_SYSPROCFS 1 )
+set( EC_HAVE_EXECINFO_BACKTRACE 1 )
+set( EC_HAVE_GMTIME_R 1 )
+set( EC_HAVE_GETPWUID_R 1 )
+set( EC_HAVE_GETPWNAM_R 1 )
+set( EC_HAVE_READDIR_R 1 )
+set( EC_HAVE_DIRENT_D_TYPE 1 )
+set( EC_HAVE_GETHOSTBYNAME_R 1 )
+set( EC_HAVE_ATTRIBUTE_CONSTRUCTOR 1 )
+set( EC_ATTRIBUTE_CONSTRUCTOR_INITS_ARGV 0 )
+set( EC_HAVE_PROCFS 1 )
+set( EC_HAVE_DLFCN_H 1 )
+set( EC_HAVE_DLADDR 1 )
 
 # Disable relative rpaths as aprun does not respect it
 set( ENABLE_RELATIVE_RPATHS OFF CACHE STRING "Disable relative rpaths" FORCE )
diff --git a/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake b/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
index a890886..042d3da 100644
--- a/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
+++ b/share/ecbuild/toolchains/ecmwf-XC30-Intel.cmake
@@ -1,7 +1,100 @@
 ####################################################################
 # ARCHITECTURE
 ####################################################################
+
+set( EC_HAVE_C_INLINE 1 )
+set( EC_HAVE_FUNCTION_DEF 1 )
+set( EC_HAVE_CXXABI_H 1 )
+set( EC_HAVE_CXX_BOOL 1 )
+set( EC_HAVE_CXX_SSTREAM 1 )
+set( EC_HAVE_CXX_INT_128 1 )
 set( CMAKE_SIZEOF_VOID_P 8 )
+set( EC_SIZEOF_PTR 8 )
+set( EC_SIZEOF_CHAR 1 )
+set( EC_SIZEOF_SHORT 2 )
+set( EC_SIZEOF_INT 4 )
+set( EC_SIZEOF_LONG 8 )
+set( EC_SIZEOF_LONG_LONG 8 )
+set( EC_SIZEOF_FLOAT 4 )
+set( EC_SIZEOF_DOUBLE 8 )
+set( EC_SIZEOF_LONG_DOUBLE 16 )
+set( EC_SIZEOF_SIZE_T 8 )
+set( EC_SIZEOF_SSIZE_T 8 )
+set( EC_SIZEOF_OFF_T 8 )
+set( EC_SIZEOF_OFF_T 8 )
+set( EC_BIG_ENDIAN 0 )
+set( EC_LITTLE_ENDIAN 1 )
+set( IEEE_BE 0 )
+set( IEEE_LE 1 )
+set( EC_HAVE_FSEEK 1 )
+set( EC_HAVE_FSEEKO 1 )
+set( EC_HAVE_FTELLO 1 )
+set( EC_HAVE_LSEEK 0 )
+set( EC_HAVE_FTRUNCATE 0 )
+set( EC_HAVE_OPEN 0 )
+set( EC_HAVE_FOPEN 1 )
+set( EC_HAVE_FMEMOPEN 1 )
+set( EC_HAVE_FUNOPEN 0 )
+set( EC_HAVE_FLOCK 1 )
+set( EC_HAVE_MMAP 1 )
+set( EC_HAVE_POSIX_MEMALIGN 1 )
+set( EC_HAVE_F_GETLK 1 )
+set( EC_HAVE_F_SETLK 1 )
+set( EC_HAVE_F_SETLKW 1 )
+set( EC_HAVE_F_GETLK64 1 )
+set( EC_HAVE_F_SETLK64 1 )
+set( EC_HAVE_F_SETLKW64 1 )
+set( EC_HAVE_MAP_ANONYMOUS 1 )
+set( EC_HAVE_MAP_ANON 1 )
+set( EC_HAVE_ASSERT_H 1 )
+set( EC_HAVE_STDLIB_H 1 )
+set( EC_HAVE_UNISTD_H 1 )
+set( EC_HAVE_STRING_H 1 )
+set( EC_HAVE_STRINGS_H 1 )
+set( EC_HAVE_SYS_STAT_H 1 )
+set( EC_HAVE_SYS_TIME_H 1 )
+set( EC_HAVE_SYS_TYPES_H 1 )
+set( EC_HAVE_MALLOC_H 1 )
+set( EC_HAVE_SYS_MALLOC_H 0 )
+set( EC_HAVE_SYS_PARAM_H 1 )
+set( EC_HAVE_SYS_MOUNT_H 1 )
+set( EC_HAVE_SYS_VFS_H 1 )
+set( EC_HAVE_OFFT 1 )
+set( EC_HAVE_OFF64T 1 )
+set( EC_HAVE_STRUCT_STAT 1 )
+set( EC_HAVE_STRUCT_STAT64 1 )
+set( EC_HAVE_STAT 1 )
+set( EC_HAVE_STAT64 1 )
+set( EC_HAVE_FSTAT 1 )
+set( EC_HAVE_FSTAT64 1 )
+set( EC_HAVE_FSEEKO64 1 )
+set( EC_HAVE_FTELLO64 1 )
+set( EC_HAVE_LSEEK64 1 )
+set( EC_HAVE_OPEN64 1 )
+set( EC_HAVE_FOPEN64 1 )
+set( EC_HAVE_FTRUNCATE64 1 )
+set( EC_HAVE_FLOCK64 1 )
+set( EC_HAVE_MMAP64 1 )
+set( EC_HAVE_STRUCT_STATVFS 1 )
+set( EC_HAVE_STRUCT_STATVFS64 1 )
+set( EC_HAVE_FOPENCOOKIE 1 )
+set( EC_HAVE_FSYNC 1 )
+set( EC_HAVE_FDATASYNC 1 )
+set( EC_HAVE_DIRFD 1 )
+set( EC_HAVE_SYSPROC 0 )
+set( EC_HAVE_SYSPROCFS 1 )
+set( EC_HAVE_EXECINFO_BACKTRACE 1 )
+set( EC_HAVE_GMTIME_R 1 )
+set( EC_HAVE_GETPWUID_R 1 )
+set( EC_HAVE_GETPWNAM_R 1 )
+set( EC_HAVE_READDIR_R 1 )
+set( EC_HAVE_DIRENT_D_TYPE 1 )
+set( EC_HAVE_GETHOSTBYNAME_R 1 )
+set( EC_HAVE_ATTRIBUTE_CONSTRUCTOR 1 )
+set( EC_ATTRIBUTE_CONSTRUCTOR_INITS_ARGV 0 )
+set( EC_HAVE_PROCFS 1 )
+set( EC_HAVE_DLFCN_H 1 )
+set( EC_HAVE_DLADDR 1 )
 
 # Disable relative rpaths as aprun does not respect it
 set( ENABLE_RELATIVE_RPATHS OFF CACHE STRING "Disable relative rpaths" FORCE )
diff --git a/share/ecflow/etc/CMakeLists.txt b/share/ecflow/etc/CMakeLists.txt
index 5b8ab92..27afd71 100644
--- a/share/ecflow/etc/CMakeLists.txt
+++ b/share/ecflow/etc/CMakeLists.txt
@@ -6,6 +6,7 @@ set (files ecflowview_menus.json
            ecflowview_gui_server.json
            ecflowview_highlighter.json
            ecflowview_icon_conf.json
+           ecflowview_menu_conf.json
            ecflowview_notification_conf.json
            ecflowview_nstate_conf.json
            ecflowview_palette.json
diff --git a/share/ecflow/etc/ecflowview_gui.json b/share/ecflow/etc/ecflowview_gui.json
index 532ad17..334dc0a 100644
--- a/share/ecflow/etc/ecflowview_gui.json
+++ b/share/ecflow/etc/ecflowview_gui.json
@@ -188,6 +188,16 @@
                         "line" : "completeBorderColour",
                         "line" : "completeFontColour"
                     }
+                },
+                "tab" : {
+                    "label" : "Toolbar",
+
+                    "group" : {
+                        "title" : "Server refresh button",
+                        "prefix" : "server.update",
+                        "line" : "blinkUpdateButtonLimit",
+                        "line" : "showLastRefreshTimeInAutoMode"
+                    }
                 }
             }
         },
@@ -226,6 +236,36 @@
             }
         },
 
+        "menu":  {
+            "label": "Menus",
+            "desc" : "Menus",
+            "icon" : "menu.svg",
+
+            "group" : {
+                "title" : "Node context menu",
+                "prefix" : "menu.access",
+
+                "line" : "nodeMenuMode",
+                "note" : {
+                            "default" : "Operator and Administrator modes allow suites to be begun, nodes to be removed and servers to be unlocked. Administrator mode additionally enables the <I>Force</I> and <I>Order</I> menus."
+                         }
+            },
+            "group" : {
+                "title" : "Request confirmation when:",
+                "prefix" : "menu.confirm",
+
+                "line" : "confirmRequeue",
+                "line" : "confirmRequeueAborted",
+                "line" : "confirmSetComplete",
+                "line" : "confirmSetABorted",
+                "line" : "confirmForceComplete",
+                "line" : "confirmForceAborted",
+                "line" : "confirmKillTask",
+                "line" : "confirmKillSuite"
+            }
+
+        },
+
         "notification":  {
             "visible" : "true",
             "label": "Notifications",
@@ -250,15 +290,7 @@
                             "default" : "These settings can be customised for each server separately"
                         }
 
-                    },
-                    "group" : {
-                        "title" : "Colour",
-                        "line" : "notification.aborted.count_fill_colour",
-                        "line" : "notification.aborted.count_text_colour",
-                        "note" : {
-                            "default" : "For aborted notifications the background and text colours <br> are taken from the <u>Status</u> colour settings"
-                        }
-                    },
+                    },                  
                     "group" : {
                         "title" : "Sound",
                         "line" : "notification.aborted.sound_file_type",
@@ -282,14 +314,7 @@
                         "note" : {
                             "default" : "These settings can be customised for each server separately"
                         }
-                    },
-                    "group" : {
-                        "title" : "Colour",
-                        "line" : "notification.restarted.fill_colour",
-                        "line" : "notification.restarted.text_colour",
-                        "line" : "notification.restarted.count_fill_colour",
-                        "line" : "notification.restarted.count_text_colour"
-                    },
+                    },                    
                     "group" : {
                         "title" : "Sound",
                         "line" : "notification.restarted.sound_file_type",
@@ -313,14 +338,7 @@
                         "note" : {
                             "default" : "These settings can be customised for each server separately"
                         }
-                    },
-                    "group" : {
-                        "title" : "Colour",
-                        "line" : "notification.late.fill_colour",
-                        "line" : "notification.late.text_colour",
-                        "line" : "notification.late.count_fill_colour",
-                        "line" : "notification.late.count_text_colour"
-                    },
+                    },                    
                     "group" : {
                         "title" : "Sound",
                         "line" : "notification.late.sound_file_type",
@@ -344,14 +362,7 @@
                         "note" : {
                             "default" : "These settings can be customised for each server separately"
                         }
-                    },
-                    "group" : {
-                        "title" : "Colour",
-                        "line" : "notification.zombie.fill_colour",
-                        "line" : "notification.zombie.text_colour",
-                        "line" : "notification.zombie.count_fill_colour",
-                        "line" : "notification.zombie.count_text_colour"
-                    },
+                    },                   
                     "group" : {
                         "title" : "Sound",
                         "line" : "notification.zombie.sound_file_type",
@@ -375,14 +386,7 @@
                         "note" : {
                             "default" : "These settings can be customised for each server separately"
                         }
-                    },
-                    "group" : {
-                        "title" : "Colour",
-                        "line" : "notification.alias.fill_colour",
-                        "line" : "notification.alias.text_colour",
-                        "line" : "notification.alias.count_fill_colour",
-                        "line" : "notification.alias.count_text_colour"
-                    },
+                    },                    
                     "group" : {
                         "title" : "Sound",
                         "line" : "notification.alias.sound_file_type",
@@ -400,43 +404,50 @@
         },
 
         "server": {
-            "label" : "Server options",
-            "desc" : "Server options",
-            "icon" : "server.svg",
-            "group" : {
-
-                "title" : "Update",
-                "prefix" : "server.update",
+            "label" : "Server settings",
+            "desc" : "Server settings",
+            "icon" : "cogwheel_blue.svg",
+            "tabs"  : {
+                "tab" : {
+                    "label"  : "Refresh",
 
-                "line" : "autoUpdate",
-                "line" : "updateRateInSec",
-                "line" : "adaptiveUpdate",
-                "note" : {
-                    "default": "When enabled the server update period is <u>increased at every automatic update</u> until the maximum period is reached. If the user in the meantime updates the server manually the update period is set back to its original value and whole process starts again."
+                    "group" : {
+                        "title" : "Options",
+                        "prefix" : "server.update",
+                        "line" : "autoUpdate",
+                        "line" : "updateRateInSec",
+                        "line" : "adaptiveUpdate",
+                        "note" : {
+                            "default": "When enabled the server refresh period is <u>increased at every automatic refresh</u> until the maximum period is reached. If the user in the meantime refreshes the server manually the refresh period is set back to its original value and whole process starts again."
+                        },
+                        "line" : "adaptiveUpdateIncrementInSec",
+                        "line" : "maxAdaptiveUpdateRateInMin"
+                    }
                 },
-                "line" : "adaptiveUpdateIncrementInSec",
-                "line" : "maxAdaptiveUpdateRateInMin"
-            },
-
-            "group" : {
 
-                "title" : "Files (manual, script, job and job output)",
-                "prefix" : "server.files",
-                
-                "line" : "readFilesFromDisk",
-                "line" : "maxOutputFileLines"
-            },
+                "tab" : {
+                    "label"  : "Fetching files",
+                    "group" : {
+                        "title" : "Manual, script, job and job output",
+                        "prefix" : "server.files",
+                        "line" : "readFilesFromDisk",
+                        "line" : "maxOutputFileLines"
+                    }
+                },
 
-            "group" : {
+                "tab" : {
 
-                "title" : "Automatic search on output files",
-                "prefix" : "panel.output.automaticSearch",
-                
-                "line" : "performSearch",
-                "line" : "searchMode",
-                "line" : "searchText",
-                "line" : "searchFrom",
-                "line" : "caseSensitive"
+                    "label" : "Search in output",
+                    "group" : {
+                       "title" : "Automatic search on output files",
+                       "prefix" : "panel.output.automaticSearch",
+                        "line" : "performSearch",
+                        "line" : "searchMode",
+                        "line" : "searchText",
+                        "line" : "searchFrom",
+                        "line" : "caseSensitive"
+                    }
+                }
             },
 
             "grid-hidden" : {
@@ -487,16 +498,7 @@
                     "line" : "soundFile"
                 }
             }
-
-        },
-
-        "Tree view" : {
-            "visible" : "false",
-            "desc" : "Tree view options",
-
-            "line" : "view.tree.font",
-            "line" : "view.tree.nodeRectRadius",
-            "line" : "view.tree.displayChildCount"
         }
+
     }
 }
diff --git a/share/ecflow/etc/ecflowview_gui_server.json b/share/ecflow/etc/ecflowview_gui_server.json
index 894f71e..3dad5a3 100644
--- a/share/ecflow/etc/ecflowview_gui_server.json
+++ b/share/ecflow/etc/ecflowview_gui_server.json
@@ -11,21 +11,21 @@
             
             "group" : {
                 
-                "title" : "Update",
+                "title" : "Refresh",
                 "prefix" : "server.update",
                 
                 "line" : "autoUpdate",
                 "line" : "updateRateInSec",
                 "line" : "adaptiveUpdate",
                 "note" : {
-                    "default": "When enabled the server update period is <u>increased at every automatic update</u> until the maximum period is reached. If the user in the meantime updates the server manually the update period is set back to its original value and whole process starts again."
+                    "default": "When enabled the server refresh period is <u>increased at every automatic refresh</u> until the maximum period is reached. If the user in the meantime refreshes the server manually the refresh period is set back to its original value and whole process starts again."
                 },
                 "line" : "adaptiveUpdateIncrementInSec",
                 "line" : "maxAdaptiveUpdateRateInMin"
             },
             
             "group" : {                
-                "title" : "Files",
+                "title" : "Fetching files",
                 "prefix" : "server.files",
                 
                 "line" : "readFilesFromDisk",
diff --git a/share/ecflow/etc/ecflowview_menu_conf.json b/share/ecflow/etc/ecflowview_menu_conf.json
new file mode 100644
index 0000000..0cca781
--- /dev/null
+++ b/share/ecflow/etc/ecflowview_menu_conf.json
@@ -0,0 +1,64 @@
+{
+    "menu":  {
+
+        "label" : "Menu options",
+
+        "access": {
+            "label" : "",
+            "tooltip" : "",
+
+            "nodeMenuMode": {
+                "label": "Menu mode",
+                "tooltip" : "Controls what commands are available in the node context menu.",
+                "values"  : "user/oper/admin",
+                "values_label" : "User/Operator/Administrator",
+                "default": "user"
+            }
+        },
+        "confirm": {
+            "label" : "",
+            "tooltip" : "",
+
+            "confirmRequeue": {
+                "label": "Requeuing a node",
+                "tooltip" : "Controls if a confirmation is needed for requeuing a node.",
+                "default": "true"
+            },
+            "confirmRequeueAborted": {
+                "label": "Requeuing an aborted suite or family",
+                "tooltip" : "Controls if a confirmation is needed for requeuing an aborted suite or family.",
+                "default": "true"
+            },
+            "confirmSetComplete": {
+                 "label": "Setting a task or alias to COMPLETE",
+                 "tooltip" : "Controls if a confirmation is needed for setting a task or alias to COMPLETE.",
+                 "default": "true"
+            },
+            "confirmSetAborted": {
+                 "label": "Setting a task or alias to ABORTED",
+                 "tooltip" : "Controls if a confirmation is needed for setting a task or alias to ABORTED.",
+                 "default": "true"
+            },
+            "confirmForceComplete": {
+                "label": "Forcing a node to COMPLETE",
+                "tooltip" : "Controls if a confirmation is needed for forcing a node COMPLETE.",
+                "default": "true"
+            },
+            "confirmForceAborted": {
+                "label": "Forcing a node to ABORTED",
+                "tooltip" : "Controls if a confirmation is needed for forcing a node to ABORTED.",
+                "default": "true"
+            },
+            "confirmKillTask": {
+                "label": "Killing a task or alias",
+                "tooltip" : "Controls if a confirmation is needed for killing a task or alias.",
+                "default": "true"
+            },
+            "confirmKillSuite": {
+                "label": "Killing a suite or family",
+                "tooltip" : "Controls if a confirmation is needed for killing a suite or family.",
+                "default": "true"
+            }
+        }
+    }
+}
diff --git a/share/ecflow/etc/ecflowview_menus.json b/share/ecflow/etc/ecflowview_menus.json
index 35717a5..e07457e 100644
--- a/share/ecflow/etc/ecflowview_menus.json
+++ b/share/ecflow/etc/ecflowview_menus.json
@@ -49,6 +49,18 @@
     "menu_items" :
     [
 
+        {
+            "menu"           : "Node",
+            "name"           : "Lookup in tree",
+            "command"        : "lookup",
+            "handler"        : "trigger",
+            "view"           : "trigger"
+        },
+
+        {
+             "menu"           : "Node",
+             "name"           : "-"
+        },
 
         {
             "menu"           : "Node",
@@ -83,6 +95,7 @@
             "command"        : "ecflow_client --force=complete <full_name>",
             "question_for"   : "submitted or active",
             "question"       : "Have you checked that the job is not active anymore (jobstatus)?",
+            "question_control" : "menu.confirm.confirmSetComplete",
             "default_answer" : "Yes",
             "status_tip"     : "__cmd__"
         },
@@ -95,6 +108,7 @@
             "command"        : "ecflow_client --force=aborted <full_name>",
             "question_for"   : "submitted or active",
             "question"       : "Have you checked that the job is not active anymore (jobstatus)?",
+            "question_control" : "menu.confirm.confirmSetAborted",
             "default_answer" : "Yes",
             "status_tip"     : "__cmd__"
         },
@@ -115,6 +129,7 @@
             "enabled_for"    : "(not active) and (not submitted)",
             "command"        : "ecflow_client --requeue=force <full_name>",
             "question"       : "Confirm requeuing of <full_name>",
+            "question_control" : "menu.confirm.confirmRequeue",
             "default_answer" : "Yes",
             "status_tip"     : "__cmd__"
         },
@@ -125,7 +140,8 @@
             "visible_for"    : "suite or family",
             "enabled_for"    : "aborted or suspended",
             "command"        : "ecflow_client --requeue=abort <full_name>",
-            "question"       : "Confirm requeuing of aborted tasks from <full_name>",
+            "question"       : "Confirm requeuing of aborted tasks from <full_name>",           
+            "question_control" : "menu.confirm.confirmRequeueAborted",
             "default_answer" : "Yes",
             "status_tip"     : "__cmd__"
         },
@@ -251,7 +267,7 @@
         {
             "menu"           : "Node",
             "name"           : "Remove",
-            "visible_for"    : "(suite or family or task) and (oper or admin)",
+            "visible_for"    : "(suite or alias) and (oper or admin)",
             "enabled_for"    : "(not active) and (not submitted)",
             "command"        : "ecflow_client --delete=yes <full_name>",
             "question"       : "Do you really want to remove <full_name> ?",
@@ -439,7 +455,8 @@
             "visible_for"    : "(suite or family)",
             "enabled_for"    : "(active or submitted or aborted or suspended)",
             "command"        : "ecflow_client --kill <full_name>",
-            "question"       : "Confirm kill of <full_name>",
+            "question"       : "Confirm kill of <full_name>",            
+            "question_control" : "menu.confirm.confirmKillSuite",
             "default_answer" : "Yes",
             "status_tip"     : "__cmd__"
         },
@@ -451,6 +468,7 @@
             "enabled_for"    : "(active or submitted or suspended)",
             "command"        : "ecflow_client --kill <full_name>",
             "question"       : "Confirm kill <full_name>",
+            "question_control" : "menu.confirm.confirmKillTask",
             "default_answer" : "Yes",
             "status_tip"     : "__cmd__"
         },
@@ -550,6 +568,21 @@
             "command"        : "ecflow_client --alter clear_flag migrated <full_name>",
             "status_tip"     : "__cmd__"
         },
+
+        {
+            "menu"           : "Special",
+            "name"           : "-"
+        },
+
+        {
+            "menu"           : "Special",
+            "name"           : "Filter only this suite",
+            "visible_for"    : "node",
+            "command"        : "filterOne",
+            "handler"        : "tree",
+            "view"           : "tree"
+        },
+
         {
             "menu"           : "Force",
             "name"           : "Unknown",
@@ -565,6 +598,7 @@
             "enabled_for"    : "not complete and not active and not submitted",
             "command"        : "ecflow_client --force=complete recursive <full_name>",
             "question"       : "Check running/queued jobs and Confirm force complete of <full_name>",
+            "question_control" : "menu.confirm.confirmForceComplete",
             "default_answer" : "No",
             "status_tip"     : "__cmd__"
         },
@@ -598,7 +632,8 @@
             "visible_for"    : "node",
             "enabled_for"    : "not active",
             "command"        : "ecflow_client --force=aborted recursive <full_name>",
-            "question"       : "Check running/queued jobs and Confirm force submitted of <full_name>",
+            "question"       : "Check running/queued jobs and Confirm force aborted of <full_name>",
+            "question_control" : "menu.confirm.confirmForceAborted",
             "default_answer" : "Yes",
             "status_tip"     : "__cmd__"
         },
@@ -662,11 +697,11 @@
         }, 
         {
             "menu"           : "Node",
-            "name"           : "Settings ...",
+            "name"           : "Server settings ...",
             "visible_for"    : "server",        
             "command"        : "server_settings",
             "handler"        : "info_panel",
-            "icon"           : "configure.svg"            
+            "icon"           : "cogwheel_blue.svg"
         }, 
         {
             "menu"           : "Node",
@@ -750,18 +785,18 @@
         {
             "menu"           : "Node",
             "name"           : "Edit ...",
-            "visible_for"    : "label or meter or limit or trigger",
+            "visible_for"    : "label or meter or limit or trigger or var or genvar",
             "command"        : "edit",
             "handler"        : "tree",
-            "view"           : "tree"
+            "view"           : "tree/trigger"
         },
         {
             "menu"           : "Node",
             "name"           : "Edit ...",
-            "visible_for"    : "repeat  and not repeat_day",
+            "visible_for"    : "repeat and not repeat_day",
             "command"        : "edit",
             "handler"        : "tree",
-            "view"           : "tree"
+            "view"           : "tree/trigger"
         }
     ]
 
diff --git a/share/ecflow/etc/ecflowview_notification_conf.json b/share/ecflow/etc/ecflowview_notification_conf.json
index d40e3aa..c02dfd0 100644
--- a/share/ecflow/etc/ecflowview_notification_conf.json
+++ b/share/ecflow/etc/ecflowview_notification_conf.json
@@ -12,7 +12,7 @@
             },                                    
             "aborted": {
                 "fill_colour" : {
-                    "label" : "Backgorund colour",
+                    "label" : "Background colour",
                     "default": "rgb(255,0,0)"
                 },
                 "text_colour" : {
@@ -57,19 +57,19 @@
                 "border":     "rgb(200,200,200)",
                 "title"  :    "Change: aborted tasks",
                 "labelText" : "Aborted",
-                "widgetText" : "A",            
+                "widgetText" : "Aborted",
                 "tooltip"    : "Notifications for tasks which have been <b>aborted</b>",
                 "description" : "Notify when a task becomes aborted"        
              },
  
             "restarted": {
                 "fill_colour" : {
-                    "label" : "Backgorund colour",
-                    "default": "rgb(248,160,71)"
+                    "label" : "Background colour",
+                    "default": "rgb(193,193,193)"
                 },
                 "text_colour" : {
                     "label" : "Text colour",
-                    "default": "rgb(30,30,30)"
+                    "default": "rgb(10,10,10)"
                 },  
                 "count_fill_colour" : {
                     "label" : "Notification count background colour",
@@ -110,18 +110,18 @@
                 "border":     "rgb(200,200,200)",
                 "title"  :    "Change: restarted tasks",
                 "labelText" : "Restarted", 
-                "widgetText" : "Re",
+                "widgetText" : "Restarted",
                 "tooltip"    : "Notifications for tasks which have been <b>restarted</b>",
                 "description" : "Notify when a task is restarted"                    
             }, 
             "late": {
                 "fill_colour" : {
-                    "label" : "Backgorund colour",
-                    "default": "rgb(248,160,71)"
+                    "label" : "Background colour",
+                    "default": "rgb(193,193,193)"
                 },
                 "text_colour" : {
                     "label" : "Text colour",
-                    "default": "rgb(30,30,30)"
+                    "default": "rgb(10,10,10)"
                 },  
                 "count_fill_colour" : {
                     "label" : "Notification count background colour",
@@ -161,18 +161,18 @@
                 "border":     "rgb(200,200,200)",
                 "title"  :    "Change: late tasks",
                 "labelText" : "Late", 
-                "widgetText" : "L",
+                "widgetText" : "Late",
                 "tooltip"    : "Notifications for tasks which have become <b>late</b>",
                 "description" : "Notify when a task becomes late"                        
             },
             "zombie": {
                 "fill_colour" : {
-                    "label" : "Backgorund colour",
-                    "default": "rgb(248,160,71)"
+                    "label" : "Background colour",
+                    "default": "rgb(193,193,193)"
                 },
                 "text_colour" : {
                     "label" : "Text colour",
-                    "default": "rgb(30,30,30)"
+                    "default": "rgb(10,10,10)"
                 }, 
                 "count_fill_colour" : {
                     "label" : "Notification count background colour",
@@ -212,18 +212,18 @@
                 "border":     "rgb(200,200,200)",
                 "title"  :    "Change: zombies",
                 "labelText" : "Zombies", 
-                "widgetText" : "Z",
+                "widgetText" : "Zombie",
                 "tooltip"    : "Notifications for tasks which have become <b>zombies</b>",
                 "description" : "Notify when a task becomes a zombie"                     
             },
             "alias": {
                 "fill_colour" : {
-                    "label" : "Backgorund colour",
-                    "default": "rgb(248,160,71)"
+                    "label" : "Background colour",
+                    "default": "rgb(193,193,193)"
                 },
                 "text_colour" : {
                     "label" : "Text colour",
-                    "default": "rgb(30,30,30)"
+                    "default": "rgb(10,10,10)"
                 }, 
                 "count_fill_colour" : {
                     "label" : "Notification count background colour",
@@ -263,7 +263,7 @@
                 "border":     "rgb(200,200,200)",
                 "title"  :    "Change: aliases",
                 "labelText" : "Aliases", 
-                "widgetText" : "As",
+                "widgetText" : "Alias",
                 "tooltip"    : "Notifications for <b>aliases</b> which have become <b>aborted</b> or have been <b>restarted</b>", 
                 "description" : "Notify when an alias becomes aborted or is restarted"                      
             }
diff --git a/share/ecflow/etc/ecflowview_panels.json b/share/ecflow/etc/ecflowview_panels.json
index 100bdd5..d0577d3 100644
--- a/share/ecflow/etc/ecflowview_panels.json
+++ b/share/ecflow/etc/ecflowview_panels.json
@@ -145,7 +145,7 @@
         {
         	"name"    : "server_settings",
             "label"   : "Settings",
-            "icon"	  : "configure.svg",
+            "icon"	  : "cogwheel_blue.svg",
             "visible_for" : "server"
              
         }  
diff --git a/share/ecflow/etc/ecflowview_server_conf.json b/share/ecflow/etc/ecflowview_server_conf.json
index f4c3123..d103a2b 100644
--- a/share/ecflow/etc/ecflowview_server_conf.json
+++ b/share/ecflow/etc/ecflowview_server_conf.json
@@ -4,43 +4,56 @@
             "label" : "Server options",
 
             "update": {
-            	"label" : "Update",
-            	"tooltip" : "update",      
+                "label" : "Refresh",
+                "tooltip" : "refresh",
             
                 "autoUpdate": {
-                    "label": "Update server state automatically",
+                    "label": "Refresh server state automatically",
                     "tooltip" : "When enabled the server is queried for updates at regular intervals.",
             		"default": "true"
                 },
             	           	
             	"updateRateInSec": {
-                    "label": "Server update period",
+                    "label": "Server refresh period",
             		"suffix" : "seconds", 
-                    "tooltip": "Defines the automatic server update period.",
+                    "tooltip": "Defines the automatic server refresh period.",
             		"default": "60",
             		"min" : "0"
                 },
                 
                 "adaptiveUpdate": {
-                    "label": "Increase server update period when inactive",
-                    "tooltip" : "When enabled the server update period is <b>increased at every automatic update</b> until the maximum period is reached. If the user in the meantime updates the server manually the update period is set back to its original value and whole process starts again.",
+                    "label": "Drift (increase) server refresh period when inactive",
+                    "tooltip" : "When enabled the server refresh period is <b>increased at every automatic refresh</b> until the maximum period is reached. If the user in the meantime interact with the server the refresh period is set back to its original value and whole process starts again.",
                 	"default": "true"
                 },
 
                 "adaptiveUpdateIncrementInSec": {
-                    "label": "Server update period increment",
+                    "label": "Server refresh drift increment",
                     "suffix" : "seconds",
-                    "tooltip": "Defines by how many seconds the server update period is <b>increased</b> at every automatic update.",
+                    "tooltip": "Defines by how many seconds the server refresh period is <b>increased</b> at every automatic refresh.",
                     "default": "5",
                     "min" : "0"
                 },
                 "maxAdaptiveUpdateRateInMin": {
-                    "label": "Do not increase server update period over",
+                    "label": "Do not increase server refresh period over",
                 	"suffix" : "minutes", 
-                    "tooltip": "Defines the <b>maximum</b> server update period. When it is reached the update period is not increased any more.",
+                    "tooltip": "Defines the <b>maximum</b> server refresh period. When it is reached the refresh period is not increased any more.",
                 	"default": "60",
                 	"min" : "0"
-                }
+                },                
+                "blinkUpdateButtonLimit" : {
+                    "label": "Do not blink refresh button for automatic refresh for periods less than",
+                    "suffix" : "seconds",
+                    "tooltip": "In automatic refresh mode the refresh button <b>will not blink</b> on automatic refresh when the total refresh period is shorter than the specified value.",
+                    "default": "5",
+                    "min"    : "1"
+                },
+                "showLastRefreshTimeInAutoMode" : {
+                    "label": "Show time of last refresh in automatic refresh mode",
+                    "tooltip": "If enabled shows the <b>time of the last refresh</b> in automatic refresh mode. If the automatic refresh is switched off the last refresh time is always visible.",
+                    "default": "false"
+                 }
+
             }, 
 
 			"files": {
diff --git a/share/ecflow/etc/ecflowview_view_conf.json b/share/ecflow/etc/ecflowview_view_conf.json
index 7beb960..801bc25 100644
--- a/share/ecflow/etc/ecflowview_view_conf.json
+++ b/share/ecflow/etc/ecflowview_view_conf.json
@@ -66,8 +66,7 @@
                   },
                  "branchLineColour" : {
                       "label" : "Branch line colour",
-                      "default": "rgb(137,137,137)",
-                      "disabledRule" : "layoutStyle=standard"
+                      "default": "rgb(137,137,137)"
                    },
 
                  "defaultAttributes" : {
@@ -202,11 +201,23 @@
             "label" : "Type",
             "tooltip" : "Node type"
         },
+        "statusChange" : {
+            "label" : "Status changed",
+            "tooltip" : "Time of the last status change (nodes only)"
+        },
         "attribute" : {
             "label" : "Attribute"
         }       
     },
     
+    "trigger_graph_columns": {
+        
+        "trigger" : {
+            "label" : "Trigger",
+            "tooltip" : "Trigger"
+        }
+    },
+
     "table_columns": {
     	
     	"path" : {
diff --git a/share/ecflow/etc/viewer.qss b/share/ecflow/etc/viewer.qss
index f87815e..54ae2aa 100644
--- a/share/ecflow/etc/viewer.qss
+++ b/share/ecflow/etc/viewer.qss
@@ -16,7 +16,8 @@ QToolBar > QToolButton {
   	padding:  1px;
 }	
 
-QToolTip { color: black; background-color: rgb(192,218,255); border: 1px solid rgb(60,59,58);}
+/*QToolTip { color: black; background: rgb(192,218,255); border: 1px solid rgb(60,59,58);}*/
+QToolTip { color: rgb(247,247,247); background: rgb(59,64,69); border: 1px solid rgb(20,20,20);}
 
 /* ----------------------------
   Breadcrumbs 
@@ -221,6 +222,33 @@ QLabel[editorInfo="1"] {
      background: rgb(242, 242, 242);
 }
 
+/*----------------------------
+  Triggers
+-----------------------------*/
+
+QWidget[triggertitle="1"] {
+     background: rgb(95, 97, 99);
+}
+
+QLabel[triggertitle="1"] {
+     color: rgb(255,255,255);
+     background: rgb(95, 97, 99);   
+}
+
+QToolButton[triggertitle="1"] {
+    border-radius: 0px;
+    padding: 0px;
+    icon-size:  18px;
+    background-color: transparent;
+}
+
+QToolButton[triggertitle="1"]:hover {
+    border-radius: 0px;
+    padding: 0px;
+    icon-size:  18px;
+    background: rgb(140,140,140);
+}
+
 
 /*----------------------------
   Property editor
@@ -279,7 +307,7 @@ QToolButton[docktitle="1"] {
     border-radius: 0px;
     padding: 0px;
     icon-size:  18px;
-    background-colour: transparent;
+    background-color: transparent;
 }
 
 QToolButton[docktitle="1"]:checked {
@@ -319,6 +347,35 @@ QTreeView[var="1"] {
   Tab widget
 ------------------------------------*/
 
+/* generic tab */
+/*
+QTabBar::tab {
+    padding-top: 3px;
+    padding-bottom: 3px;
+    padding-left: 8px;
+    padding-right: 8px;
+    border-top-left-radius: 2px;
+    border-top-right-radius: 2px;
+    border: 1px solid rgb(170,170,170);
+}
+
+QTabBar::tab:!selected {
+    margin-top: 2px;
+    background: rgb(218,219,220);
+    color: rgb(50,50,50);
+}
+
+QTabBar::tab:selected {
+    background: rgb(240,239,238);color: rgb(50,50,50)
+}
+
+QTabBar::tab:disabled {
+    background: rgb(218,219,220);
+    color: rgb(155,155,155)
+}
+*/
+
+/* The main tab in the nodepanel */
 /*QTabBar[nodePanel="1"]::close-button {
     image: url(:/viewer/dock_menu_indicator.png);
     padding-left: -13px;
@@ -356,3 +413,4 @@ QTabBar[nodePanel="1"]::tab:selected{
 /*QTabBar[change="1"]::tab {
     padding : 2px;
 }*/
+
diff --git a/view/CMakeLists.txt b/view/CMakeLists.txt
index 6b82528..f87599b 100644
--- a/view/CMakeLists.txt
+++ b/view/CMakeLists.txt
@@ -195,7 +195,6 @@ include_directories( src
                      ../ACore/src 
                      ../ANattr/src
                      ../ANode/src
-                     ../AParser/src
                      ../Base/src
                      ../Base/src/cts
                      ../Base/src/stc
@@ -230,7 +229,7 @@ ecbuild_add_executable( TARGET    ecflowview
 						CONDITION 
 						          MOTIF_FOUND AND X11_FOUND AND CMAKE_THREAD_LIBS_INIT
                         LIBS      
-                                  ecflow_view libclient base libparser node nodeattr core
+                                  ecflow_view libclient base node nodeattr core
                                   ${CMAKE_THREAD_LIBS_INIT} 
                                   ${X11_LIBRARIES} ${X11_Xext_LIB} ${MOTIF_LIBRARIES} ${X11_Xpm_LIB} ${X11_Xt_LIB} 
                                   ${CMATH_LIBRARIES}
diff --git a/view/Jamfile.jam b/view/Jamfile.jam
index 033d0ad..1143675 100644
--- a/view/Jamfile.jam
+++ b/view/Jamfile.jam
@@ -12,7 +12,7 @@ project ecflowview ;
 
 use-project theCore      : ../ACore ;
 use-project theNodeAttr  : ../ANattr ;
-use-project theNode      : ../ANode ;
+use-project theNode      : ../ANode ;  
 use-project theBase      : ../Base ;
 use-project theClient    : ../Client ;
 use-project theTest      : ../Test ;
@@ -40,7 +40,6 @@ exe ecflowview
      /theCore//core
      /theNodeAttr//nodeattr
      /theNode//node
-     /theParser//libparser
      /theBase//base
      /theClient//libclient
      /site-config//boost_system
@@ -78,7 +77,6 @@ obj host : src/host.cc
      /theCore//core
      /theNodeAttr//nodeattr
      /theNode//node
-     /theParser//libparser
      /theBase//base
      /theClient//libclient
   :  <variant>release:<optimization>off 
@@ -103,7 +101,6 @@ exe test-view : [ glob test/*.cpp  ]
            /theCore//core
            /theNodeAttr//nodeattr
            /theNode//node
-           /theParser//libparser
            /theBase//base
            /theClient//libclient
            /theTest//libharness
@@ -119,4 +116,3 @@ exe test-view : [ glob test/*.cpp  ]
            [ conditional <ssl>on : <library>/ecflow_top//openssl_libs ]
 #  	   <variant>release:<cxxflags>-O1
         ;
-# bjam -j8 release c++-template-depth=512
diff --git a/view/src/Hyper.c b/view/src/Hyper.c
index 2c38ec5..293baac 100644
--- a/view/src/Hyper.c
+++ b/view/src/Hyper.c
@@ -60,7 +60,7 @@ static void    xselect();
 static void    cursor();
 static void    activate();
 static void    xincrement();
-static void    add_to_text ( HyperWidget,char*,int,int);
+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);
@@ -200,14 +200,6 @@ HyperClassRec  hyperClassRec = {
     }
 };
 
-
-
-
-
-
-
-
-
 WidgetClass hyperWidgetClass = (WidgetClass) &hyperClassRec;
 
 /*---------------------------------------------------------------*/
@@ -235,8 +227,6 @@ HyperWidget w;
     values.font       = w->hyper.normal_font->fid;
     w->hyper.normal_gc = XtGetGC((Widget)w, valueMask, &values);
 
-
-
     valueMask = GCBackground|GCForeground|GCFunction|GCGraphicsExposures;
 
     values.background         = 0;
@@ -245,8 +235,6 @@ HyperWidget w;
     values.function           = GXxor;
 
     w->hyper.xor_gc = XtGetGC((Widget)w, valueMask, &values);
-
-
 }
 
 /*--------------------------------------------------------------*/
@@ -1006,10 +994,12 @@ XtPointer data;
         {
 	  word[i]=0;
 	  /* if(i) add_to_text(w,word,mode); */
-	  if(i) {									/* add offset */
+	  if(i) {									
+	    /* add offset */
 	    add_to_text(w,word,mode,offset);	/* add offset */
 	    offset += i;                       /* increment offset */
-	  }										/* add offset */
+	  }										
+	  /* add offset */
 	  mode = HIGHLIGHT;
 	  i = 0;
         }
@@ -1147,11 +1137,9 @@ int end_highlight;
 #else
 
 void HyperSetTags(Widget widget,
-				  int start_highlight,
-				  int end_highlight)
-
+		  int start_highlight,
+		  int end_highlight)
 #endif
-
 {
     ((HyperWidget)widget)->hyper.start_of_highlight = start_highlight;
     ((HyperWidget)widget)->hyper.end_of_highlight = end_highlight;
diff --git a/view/src/HyperP.h b/view/src/HyperP.h
index b27b15e..9f3ba19 100644
--- a/view/src/HyperP.h
+++ b/view/src/HyperP.h
@@ -78,7 +78,6 @@ typedef struct _HyperPart {
 
     int      margin;             /* margins size */
 
-
     text_segment         *grep_seg;  /* segment where found text is */
 
     char                 *grep_txt;  /* pointer to found text */
@@ -93,8 +92,6 @@ typedef struct _HyperPart {
     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;
diff --git a/view/src/ecflowview.menu b/view/src/ecflowview.menu
index b8f44a8..42334f8 100644
--- a/view/src/ecflowview.menu
+++ b/view/src/ecflowview.menu
@@ -283,8 +283,8 @@ menu "Special"
 ! ( (SUITE|FAMILY) & (COMPLETE|QUEUED|SUSPENDED) & ~MIGRATED,ALL,'Migrate', 'ecflow_client --migrate <full_name>','',NO)
 ! ( (SUITE|FAMILY) & MIGRATED,ALL,'Restore','ecflow_client --restore <full_name>','',YES)
 
-  ( (SUITE|FAMILY) & (COMPLETE|QUEUED|SUSPENDED) & ~MIGRATED,ALL,'Migrate', 'ecflow_client --alter set_flag migrated <full_name>')
-  ( (SUITE|FAMILY) & MIGRATED,ALL,'Restore','ecflow_client --alter clear_flag migrated <full_name>', 'click shift-update to display content below', YES)
+  ( (SUITE|FAMILY) & (COMPLETE|QUEUED|SUSPENDED) & ~MIGRATED,ALL,'Hide', 'ecflow_client --alter set_flag migrated <full_name>')
+  ( (SUITE|FAMILY) & MIGRATED,ALL,'Show','ecflow_client --alter clear_flag migrated <full_name>', 'click shift-update to display content below', YES)
 
   (SUITE|FAMILY,(ACTIVE|SUBMITTED|ABORTED|SUSPENDED),'Kill', 'ecflow_client --kill <full_name>','',YES)
   (TASK|ALIAS,(ACTIVE|SUBMITTED|SUSPENDED),'Kill','ecflow_client --kill <full_name>','',YES)
diff --git a/view/src/output.cc b/view/src/output.cc
index 36da782..46d443f 100644
--- a/view/src/output.cc
+++ b/view/src/output.cc
@@ -12,7 +12,6 @@
 //
 // Description : 
 //=============================================================================================
-
 #include "output.h"
 #include "node.h"
 #include "host.h"
diff --git a/view/src/selection.cc b/view/src/selection.cc
index 1c3739b..b088a2b 100644
--- a/view/src/selection.cc
+++ b/view/src/selection.cc
@@ -18,7 +18,7 @@
 #include "observer.h"
 #include "host.h"
 
-class selection_observer :public observer {
+class selection_observer : public observer {
   node* n_;
   void gone(observable*);
   void adoption(observable*,observable*);
@@ -118,7 +118,7 @@ void selection::notify_selection_cleared()
   selection* w = first();
   
   current.set(0);
-  
+
   while(w)
     {
       w->selection_cleared();
diff --git a/view/src/simple_node.cc b/view/src/simple_node.cc
index 53cb032..b5a2993 100644
--- a/view/src/simple_node.cc
+++ b/view/src/simple_node.cc
@@ -598,6 +598,7 @@ public:
   virtual void visitEventState(AstEventState*);
   virtual void visitNode(AstNode*);
   virtual void visitVariable(AstVariable*);
+  virtual void visitParentVariable(AstParentVariable*);
   virtual void visitFlag(AstFlag*);
   
 private:
@@ -644,6 +645,29 @@ void AstCollateXNodesVisitor::visitVariable(AstVariable* astVar)
   }
 }
 
+void AstCollateXNodesVisitor::visitParentVariable(AstParentVariable* 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()) {
+      //std::cout << "run->name() " << run->name() << "\n";
+      if (run->name() == astVar->name()) {
+        type = run->type();
+        if (type == NODE_EVENT
+            || type == NODE_METER
+            || type == NODE_VARIABLE) {
+          theSet_.insert(run);
+        }
+      }
+    }
+  }
+}
+
 void AstCollateXNodesVisitor::visitFlag(AstFlag* astVar)
 {
    Node* referencedNode = astVar->referencedNode();
@@ -811,8 +835,7 @@ Boolean simple_node::visible() const
 {
   int wanted = status() - STATUS_UNKNOWN + show::unknown;
   try {
-    if(selection::current_node())
-      if (selection::current_node()->full_name() == this->full_name())
+    if(selection::current_path() == this->full_name())
 	return True;
     if(this == selection::current_node()) 
       return True;
@@ -841,7 +864,6 @@ Boolean simple_node::visible_kid() const
   return visible();
 }
 
-
 const char* simple_node::status_name() const 
 {
 #ifdef BRIDGE
diff --git a/view/src/variables.cc b/view/src/variables.cc
index 775f78c..d282b11 100644
--- a/view/src/variables.cc
+++ b/view/src/variables.cc
@@ -187,8 +187,11 @@ void variables::show( node& n )
 		      (*it).name() == "ECF_PASS") 
 		    continue;
 		  const std::string& name = (*it).name();
+		  bool readOnly = name=="ECF_PASS" ||
+		    // name=="ECF_JOB" || name=="ECF_JOBOUT" ||
+		    name=="ECF_NAME";
 		  if (std::find(shown.begin(), shown.end(), name) == shown.end()) {
-		    snprintf(buffer, 1024, fmt1, name.c_str(), (*it).theValue().c_str());
+		    snprintf(buffer, 1024, readOnly ? fmt3 : fmt1, name.c_str(), (*it).theValue().c_str());
 		    xec_AddFontListItem(list_, buffer, 0);
 		    shown.push_back(name); }
                }
@@ -209,9 +212,14 @@ void variables::show( node& n )
                for(it = gvar.begin(); it !=  gvar.end(); ++it) {
 		  const std::string& name = (*it).name();
 		  if (std::find(shown.begin(), shown.end(), name) == shown.end()) {
-		    bool readOnly = name=="ECF_NODE" || name=="ECF_HOST" || name=="ECF_PORT" ||
+		    bool readOnly = name=="ECF_PASS" ||
+		      name=="ECF_PORT" ||
+		      name=="ECF_NODE" || 
+		      name=="ECF_HOST" || 
+		      name=="ECF_NAME" ||
 		      name=="ECF_LISTS" || // security ???
-		      name=="ECF_PID"  || name=="ECF_VERSION";
+		      name=="ECF_PID"  || 
+		      name=="ECF_VERSION";
 		    snprintf(buffer, 1024, readOnly ? fmt3 : fmt1, 
 			     name.c_str(), (*it).theValue().c_str());
 		    xec_AddFontListItem(list_, buffer, 0);

-- 
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