From c332c8ebbbfe424754b84e2c6713b49f65df1ebc Mon Sep 17 00:00:00 2001
From: Ruud Overeem <overeem@astron.nl>
Date: Sun, 19 Apr 2009 12:32:55 +0000
Subject: [PATCH] Bug 1000: Some major changes are made in GCF/TM:  1)
 GCFScheduler replaces all global GCFTask functions and variables.  2) An
 event-queue is introduced  3) Return value NEXT_STATE is added  4) The
 function autoOpen is added to TCP ports  5) 'fast' mode available for low
 level drivers.

Ad. 1
The GCFTask class had a lot of global functions and variables that were
not bound to one task but were multi-task items. All these things are
moved to a new class GCFScheduler. This class is a singleton class.
Consequence of this is that 'init', 'run' and 'stop' are not longer
connected to the GCFTask class but are now part of the Scheduler.

old code:
	GCFTask::init(argc, argv, argv[0]);

	myTask	a("a");
	myTasl	b("b");
	a.start();
	b.start();

	GCFTask::run();

new code:
	GCFScheduler::instance()->init(argc, argv, argv[0]);

	myTask	a("a");
	myTasl	b("b");
	a.start();
	b.start();

	GCFScheduler::instance()->run();

In the same the stop function should be called with GCFScheduler::instance()->stop();


Ad. 2
The events are now stored in a queue before they are passed to the tasks.
This has two benefits:
 - The code does not have to be re-entrant anymore because TRAN drops the
   F_EXIT and F_ENTRY in the queue in stead of executing them during the TRAN-line.
 - The values for GCFEvent::TResult you return DO MATTER NOW. See Ad 3.

The disadvantage of the queue is that the scheduler has to make a copy of
the event before placing it in the queue. To avoid needless copies all events
that are NO framework events (F_FSM_PROTOCOL and F_PORT_PROTOCOL) are passed
immediately to the task. When the task returns HANDLED we save ourselves the
effort of a copy. When anything else is returned the event is treated accordingly. See Ad 3.


Ad. 3
Since there is a queue now, the value returned by the task matters:
HANDLED: event is removed from the queue.
NEXT_STATE: event is parked on the queue until the task changes state with TRAN(...).
After the F_ENTRY event all events that were parked with NEXT_STATE are passed
to the task again.
NOT_HANDLED: this value will become OBSOLETE since it doesn't tell the scheduler
what to do. FOR NOW the event will be destroyed.

Remark: In the future the return values may be extended with values like
HOLD_x_SEC or HOLD_x_EVENTS.


Ad. 4
To simplify opening or reopening a port the function autoOpen is added to TCPPorts.
syntax: autoOpen(nrRetries, maxTimeout, reconnectInterval)

This function does several retries to setup the connection. The user can choose
the use the nrRetries and reconnectInterval arguments or use the maxTimeout
(and reconnectinterval) arguments:
  nrRetries        : -1 = infinite ; How often to retry the open when it fails.
  reconnectInterval: After how many seconds after a fail a reconnect attempt will be made.
  timeout          : -1 = infinite ; How long the auto-open attempts may last.

When both nrRetries and timeout are specified the condition that will be met first will
stop the auto open sequence.

When the connection is made an F_CONNECTED events is send like open() does. When the
connection can not be made within the given limitations a F_DISCONNECTED is returned.

Note: autoOpen(0,0) acts the same as open()


Ad. 5
Lowlevel drivers like the RSPDriver which heavily lean on FSMs (several 100's)  may
not be happy with the eventqueue because statetransitions are handled via the queue.
These drivers can call 'disableQueue()' after calling GCFScheduler::instance()->init(..).
The queue mechanisme is than completely bypassed and everything works like the
old-situation again.


Internal notes:
The boolean that the open() function returned was not really straitforward defined
and therefor not used anywhere (as far as I know). The value that is returned now is
true when a CONNECT or DISCONNECT message in placed in the queue and false when the
ServiceBrokerTask needs so more time to give a result.
---
 MAC/APL/CEPCU/configure.in                    |   1 +
 .../src/BGPlogProcessor/BGPlogProcessor.cc    | 244 +++++
 .../src/BGPlogProcessor/BGPlogProcessor.conf  |   5 +
 .../src/BGPlogProcessor/BGPlogProcessor.h     |  92 ++
 .../BGPlogProcessor/BGPlogProcessorMain.cc    |  59 ++
 MAC/APL/CEPCU/src/BGPlogProcessor/Makefile.am |  15 +
 MAC/APL/CEPCU/src/Makefile.am                 |   2 +-
 MAC/APL/CEPCU/src/OnlineControl/CEPApplMgr.cc |   4 +-
 .../CEPCU/src/OnlineControl/OnlineControl.cc  |   2 +-
 .../src/OnlineControl/OnlineControlMain.cc    |   4 +-
 .../src/CTStartDaemon/CTStartDaemonMain.cc    |   4 +-
 .../CUDaemons/src/LogClient/LogClientMain.cc  |   4 +-
 .../src/ServiceBroker/ServiceBrokerMain.cc    |   4 +-
 .../src/KeyValueLogger/KeyValueLogger.h       |   6 +-
 .../src/KeyValueLogger/KeyValueLoggerMain.cc  |   4 +-
 .../src/LogProcessor/LogProcessor.cc          |   3 +
 .../src/LogProcessor/LogProcessor.h           |   6 +-
 .../src/LogProcessor/LogProcessorMain.cc      |   4 +-
 .../src/SASGateway/SASGatewayMain.cc          |   4 +-
 .../src/SoftwareMonitor/SoftwareMonitor.h     |   1 +
 .../SoftwareMonitor/SoftwareMonitorMain.cc    |   8 +-
 .../MainCU/src/MACScheduler/MACScheduler.cc   |   2 +-
 .../src/MACScheduler/MACSchedulerMain.cc      |   4 +-
 MAC/APL/MainCU/src/MACScheduler/ObsClaimer.h  |   1 +
 .../ObservationControl/ObservationControl.cc  |   2 +-
 .../ObservationControlMain.cc                 |   4 +-
 MAC/APL/PAC/BeamServer/src/BeamServer.cc      |   2 +-
 MAC/APL/PAC/BeamServer/src/BeamServer.h       |   5 +
 MAC/APL/PAC/BeamServer/src/BeamServerMain.cc  |   4 +-
 MAC/APL/PAC/BeamServer/src/beamctl.cc         |   8 +-
 MAC/APL/PAC/BeamServer/src/beamctl.h          |   9 +-
 MAC/APL/PAC/BeamServer/test/AVTStub.cc        |   6 +-
 MAC/APL/PAC/BeamServer/test/BeamServerTest.cc |   2 +-
 MAC/APL/PAC/BeamServer/test/EPATest.cc        |   6 +-
 MAC/APL/PAC/BeamServer/test/SweepTest.cc      |   6 +-
 MAC/APL/PAC/CalServer/src/ACMProxy.cc         |   1 +
 MAC/APL/PAC/CalServer/src/ACMProxy.h          |   5 +-
 MAC/APL/PAC/CalServer/src/CalServer.cc        |   5 +-
 MAC/APL/PAC/CalServer/src/CalServer.h         |   4 +
 .../PAC/CalServer/src/SubArraySubscription.h  |   1 +
 MAC/APL/PAC/CalServer/src/calinfo.cc          |   6 +-
 MAC/APL/PAC/CalServer/src/calinfo.h           |   2 +
 MAC/APL/PAC/CalServer/test/CalTest.cc         |   7 +-
 MAC/APL/PAC/CalServer/test/CalTest.h          |   9 +-
 MAC/APL/PIC/RSPDriver/src/Command.h           |   1 +
 MAC/APL/PIC/RSPDriver/src/RSPDriver.cc        |  14 +-
 MAC/APL/PIC/RSPDriver/src/RSPDriver.h         |   3 +
 MAC/APL/PIC/RSPDriver/src/RawEvent.cc         |   3 +-
 MAC/APL/PIC/RSPDriver/src/Scheduler.cc        |  15 +-
 MAC/APL/PIC/RSPDriver/src/Sequencer.cc        |  15 +-
 MAC/APL/PIC/RSPDriver/src/Sequencer.h         |   3 +
 MAC/APL/PIC/RSPDriver/src/SyncAction.cc       |   9 +-
 MAC/APL/PIC/RSPDriver/src/SyncAction.h        |   2 +
 MAC/APL/PIC/RSPDriver/src/rspctl.cc           |  64 +-
 MAC/APL/PIC/RSPDriver/src/rspctl.h            |   5 +-
 MAC/APL/PIC/RSPDriver/test/EPAStub.cc         |  31 +-
 MAC/APL/PIC/RSPDriver/test/EPAStub.h          |   5 +-
 MAC/APL/PIC/RSPDriver/test/RSPTest.cc         |   7 +-
 MAC/APL/PIC/RSPDriver/test/RSPTest.h          |   4 +
 .../SHMInfoServer/src/SHMInfoServerMain.cc    |   4 +-
 MAC/APL/PIC/SHMInfoServer/src/SHMSession.cc   |   6 +-
 MAC/APL/PIC/TBBDriver/src/AllocCmd.cc         |   1 +
 MAC/APL/PIC/TBBDriver/src/ArpCmd.cc           |   1 +
 MAC/APL/PIC/TBBDriver/src/ArpModeCmd.cc       |   1 +
 MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc  |   1 +
 MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h   |   3 +
 MAC/APL/PIC/TBBDriver/src/ClearCmd.cc         |   1 +
 MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc        |   1 +
 MAC/APL/PIC/TBBDriver/src/DriverSettings.h    |   1 +
 MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc        |   1 +
 MAC/APL/PIC/TBBDriver/src/FreeCmd.cc          |   1 +
 MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc     |   1 +
 MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc    |   1 +
 MAC/APL/PIC/TBBDriver/src/RawEvent.cc         |   2 +-
 MAC/APL/PIC/TBBDriver/src/RawEvent.h          |   2 +
 MAC/APL/PIC/TBBDriver/src/ReadCmd.cc          |   1 +
 MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc         |   1 +
 MAC/APL/PIC/TBBDriver/src/ReadrCmd.cc         |   1 +
 MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc         |   1 +
 MAC/APL/PIC/TBBDriver/src/ReadxCmd.cc         |   1 +
 MAC/APL/PIC/TBBDriver/src/RecordCmd.cc        |   1 +
 MAC/APL/PIC/TBBDriver/src/ResetCmd.cc         |   1 +
 MAC/APL/PIC/TBBDriver/src/SizeCmd.cc          |   1 +
 MAC/APL/PIC/TBBDriver/src/StatusCmd.cc        |   1 +
 MAC/APL/PIC/TBBDriver/src/StopCepCmd.cc       |   1 +
 MAC/APL/PIC/TBBDriver/src/StopCmd.cc          |   1 +
 MAC/APL/PIC/TBBDriver/src/TBBDriver.cc        |  13 +-
 MAC/APL/PIC/TBBDriver/src/TBBDriver.h         |   5 +
 MAC/APL/PIC/TBBDriver/src/TempLimitCmd.cc     |   1 +
 MAC/APL/PIC/TBBDriver/src/TrigCoefCmd.cc      |   1 +
 MAC/APL/PIC/TBBDriver/src/TrigGenCmd.cc       |   1 +
 MAC/APL/PIC/TBBDriver/src/TrigInfoCmd.cc      |   1 +
 MAC/APL/PIC/TBBDriver/src/TrigReleaseCmd.cc   |   1 +
 MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc     |   1 +
 MAC/APL/PIC/TBBDriver/src/TrigclrCmd.cc       |   1 +
 MAC/APL/PIC/TBBDriver/src/UdpCmd.cc           |   1 +
 MAC/APL/PIC/TBBDriver/src/VersionCmd.cc       |   1 +
 MAC/APL/PIC/TBBDriver/src/WatchDogCmd.cc      |   1 +
 MAC/APL/PIC/TBBDriver/src/WritefCmd.cc        |   1 +
 MAC/APL/PIC/TBBDriver/src/WriterCmd.cc        |   1 +
 MAC/APL/PIC/TBBDriver/src/WritewCmd.cc        |   1 +
 MAC/APL/PIC/TBBDriver/src/XXXCmd.cc           |   1 +
 MAC/APL/PIC/TBBDriver/src/tbbctl.cc           |  19 +-
 MAC/APL/PIC/TBBDriver/src/tbbctl.h            |   4 +
 MAC/APL/PIC/TBBDriver/test/StubRawEvent.cc    |   2 +-
 MAC/APL/PIC/TBBDriver/test/TBBTest.cc         |   7 +-
 MAC/APL/PIC/TBBDriver/test/TBBTest.h          |   4 +
 MAC/APL/PIC/TBBDriver/test/TPStub.cc          |   7 +-
 MAC/APL/PIC/TBBDriver/test/TPStub.h           |   3 +
 .../include/APL/RTDBCommon/ClaimMgrTask.h     |   1 +
 MAC/APL/RTDBCommon/test/tClaimManager.cc      |   6 +-
 MAC/APL/RTDBCommon/test/tClaimManager.h       |   8 +-
 MAC/APL/RTDBCommon/test/tRTDButilities.cc     |   6 +-
 MAC/APL/RTDBCommon/test/tRTDButilities.h      |   6 +-
 .../include/APL/ClockProtocol/Makefile.am     |   3 +
 .../APL/ClockProtocol/Package__Version.h      |  40 +
 MAC/APL/StationCU/include/Makefile.am         |   5 +
 .../StationCU/src/BeamControl/BeamControl.cc  |   2 +-
 .../src/BeamControl/BeamControlMain.cc        |   4 +-
 .../CalibrationControl/CalibrationControl.cc  |   2 +-
 .../CalibrationControlMain.cc                 |   4 +-
 .../src/ClockControl/ClockControl.cc          |   2 +-
 .../src/ClockControl/ClockControlMain.cc      |   4 +-
 .../src/HardwareMonitor/ECMonitor.cc          |   2 +-
 .../HardwareMonitor/HardwareMonitorMain.cc    |   8 +-
 .../StationCU/src/StationControl/ActiveObs.cc |   8 +-
 .../src/StationControl/StationControl.cc      |   8 +-
 .../src/StationControl/StationControlMain.cc  |   4 +-
 .../StationCU/src/TBBControl/TBBControl.cc    |   2 +-
 .../src/TBBControl/TBBControlMain.cc          |   4 +-
 MAC/APL/TestCtlr/src/ControllerMenu.cc        |  34 +-
 MAC/APL/TestCtlr/src/ControllerMenuMain.cc    |   4 +-
 MAC/APL/TestCtlr/src/TestControllerMain.cc    |   4 +-
 MAC/Deployment/data/PVSS/Adder.dpdef          |   3 +-
 MAC/GCF/PVSS/src/GSA_SCADAHandler.cc          |  10 +-
 MAC/GCF/PVSS/src/GSA_SCADAHandler.h           |   2 +-
 MAC/GCF/PVSS/test/tMonitorState.cc            |   6 +-
 MAC/GCF/PVSS/test/tMonitorState.h             |   2 +
 MAC/GCF/PVSS/test/tPVSSservice.cc             |   6 +-
 MAC/GCF/PVSS/test/tPVSSservice.h              |   8 +-
 MAC/GCF/PVSS/test/tPerformance.cc             |   6 +-
 MAC/GCF/PVSS/test/tPerformance.h              |   3 +
 MAC/GCF/RTDB/src/DPanswer.cc                  |   3 +-
 MAC/GCF/RTDB/test/tDPservice.cc               |   6 +-
 MAC/GCF/RTDB/test/tDPservice.h                |   3 +
 MAC/GCF/RTDB/test/tPerformanceReport.cc       |   6 +-
 MAC/GCF/RTDB/test/tPerformanceReport.h        |   3 +
 MAC/GCF/RTDB/test/tPropertySet.cc             |   6 +-
 MAC/GCF/RTDB/test/tPropertySet.h              |   3 +
 MAC/GCF/RTDB/test/tRTDBPerformance.cc         |   6 +-
 MAC/GCF/RTDB/test/tRTDBPerformance.h          |   3 +
 MAC/GCF/RTDB/test/testQuery.cc                |  10 +-
 MAC/GCF/RTDB/test/testQuery.h                 |   3 +
 MAC/GCF/TM/include/GCF/TM/GCF_Fsm.h           | 151 ++-
 MAC/GCF/TM/include/GCF/TM/GCF_Handler.h       |  37 +-
 MAC/GCF/TM/include/GCF/TM/GCF_PortInterface.h |   5 +-
 MAC/GCF/TM/include/GCF/TM/GCF_Protocols.h     |   2 +
 MAC/GCF/TM/include/GCF/TM/GCF_RawPort.h       |  34 +-
 MAC/GCF/TM/include/GCF/TM/GCF_Scheduler.h     | 228 +++++
 MAC/GCF/TM/include/GCF/TM/GCF_TCPPort.h       |  60 +-
 MAC/GCF/TM/include/GCF/TM/GCF_Task.h          | 122 +--
 MAC/GCF/TM/include/GCF/TM/Makefile.am         |   1 +
 MAC/GCF/TM/src/GCF_Fsm.cc                     |  76 +-
 MAC/GCF/TM/src/GCF_Handler.cc                 |  39 +
 MAC/GCF/TM/src/GCF_Protocols.cc               |   5 +-
 MAC/GCF/TM/src/GCF_Scheduler.cc               | 420 ++++++++
 MAC/GCF/TM/src/GCF_Task.cc                    | 238 -----
 MAC/GCF/TM/src/Makefile.am                    |   5 +-
 MAC/GCF/TM/src/Port/GCF_PortInterface.cc      |  11 +
 MAC/GCF/TM/src/Port/GCF_RawPort.cc            | 133 +--
 MAC/GCF/TM/src/PortImpl/GCF_DevicePort.cc     |  70 +-
 MAC/GCF/TM/src/PortImpl/GCF_ETHRawPort.cc     |   2 -
 MAC/GCF/TM/src/PortImpl/GCF_ITCPort.cc        |   4 +-
 MAC/GCF/TM/src/PortImpl/GCF_TCPPort.cc        | 199 +++-
 MAC/GCF/TM/src/PortImpl/GTM_Device.cc         |   2 +-
 MAC/GCF/TM/src/PortImpl/GTM_Device.h          |   2 +-
 MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.cc      |   2 +-
 MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.h       |   2 +-
 MAC/GCF/TM/src/PortImpl/GTM_File.cc           | 145 +--
 MAC/GCF/TM/src/PortImpl/GTM_File.h            |  23 +-
 MAC/GCF/TM/src/PortImpl/GTM_FileHandler.cc    | 111 ++-
 MAC/GCF/TM/src/PortImpl/GTM_FileHandler.h     |  27 +-
 .../TM/src/PortImpl/GTM_TCPServerSocket.cc    | 176 ++--
 MAC/GCF/TM/src/PortImpl/GTM_TCPServerSocket.h |  45 +-
 MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.cc      |   8 +-
 MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.h       |  38 +-
 MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.cc |   6 +-
 MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.h  |   9 +-
 .../TM/src/ServiceBroker/ServiceBrokerTask.cc |  34 +-
 .../TM/src/ServiceBroker/ServiceBrokerTask.h  |  32 +-
 MAC/GCF/TM/src/Timer/GTM_Timer.cc             |   4 +-
 MAC/GCF/TM/src/Timer/GTM_TimerHandler.cc      |  50 +-
 MAC/GCF/TM/src/Timer/GTM_TimerHandler.h       |  14 +-
 MAC/GCF/TM/test/Echo.cc                       |  43 +-
 MAC/GCF/TM/test/Echo.h                        |  11 +-
 MAC/GCF/TM/test/Makefile.am                   |  32 +-
 MAC/GCF/TM/test/Makefile.in                   | 907 ++++++++++++++++++
 MAC/GCF/TM/test/Ping.cc                       |  18 +-
 MAC/GCF/TM/test/Ping.h                        |   9 +-
 MAC/GCF/TM/test/tAutoOpen.cc                  | 370 +++++++
 MAC/GCF/TM/test/tAutoOpen.h                   |  66 ++
 MAC/GCF/TM/test/tClient.cc                    | 145 +++
 MAC/GCF/TM/test/tClient.h                     |  60 ++
 MAC/GCF/TM/test/tEventQueue.cc                | 339 +++++++
 MAC/GCF/TM/test/tEventQueue.h                 |  64 ++
 MAC/GCF/TM/test/tGCFPort.cc                   |   8 +-
 MAC/GCF/TM/test/tGCFTask1.cc                  |   4 +-
 MAC/GCF/TM/test/tGCFTask2.cc                  |   8 +-
 MAC/GCF/TM/test/tGCFTask3.cc                  |   4 +-
 MAC/GCF/TM/test/tGCFTask4.cc                  |   8 +-
 MAC/GCF/TM/test/tGCFTask5.cc                  |   8 +-
 MAC/GCF/TM/test/tServer.cc                    | 106 ++
 MAC/GCF/TM/test/tServer.h                     |  51 +
 MAC/GCF/TM/test/tStateResult.cc               | 225 +++++
 MAC/GCF/TM/test/tStateResult.h                |  58 ++
 MAC/GCF/TM/test/tTimer.cc                     |   6 +-
 MAC/GCF/TM/test/testTask.cc                   |   5 +-
 MAC/GCF/TM/test/testTask.h                    |   2 +
 MAC/MACIO/include/MACIO/GCF_Event.h           |   7 +-
 MAC/MACIO/src/GCF_Event.cc                    |  10 +-
 220 files changed, 4863 insertions(+), 1427 deletions(-)
 create mode 100644 MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.cc
 create mode 100644 MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.conf
 create mode 100644 MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.h
 create mode 100644 MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessorMain.cc
 create mode 100644 MAC/APL/CEPCU/src/BGPlogProcessor/Makefile.am
 create mode 100644 MAC/APL/StationCU/include/APL/ClockProtocol/Makefile.am
 create mode 100644 MAC/APL/StationCU/include/APL/ClockProtocol/Package__Version.h
 create mode 100644 MAC/APL/StationCU/include/Makefile.am
 create mode 100644 MAC/GCF/TM/include/GCF/TM/GCF_Scheduler.h
 create mode 100644 MAC/GCF/TM/src/GCF_Handler.cc
 create mode 100644 MAC/GCF/TM/src/GCF_Scheduler.cc
 delete mode 100644 MAC/GCF/TM/src/GCF_Task.cc
 create mode 100644 MAC/GCF/TM/test/Makefile.in
 create mode 100644 MAC/GCF/TM/test/tAutoOpen.cc
 create mode 100644 MAC/GCF/TM/test/tAutoOpen.h
 create mode 100644 MAC/GCF/TM/test/tClient.cc
 create mode 100644 MAC/GCF/TM/test/tClient.h
 create mode 100644 MAC/GCF/TM/test/tEventQueue.cc
 create mode 100644 MAC/GCF/TM/test/tEventQueue.h
 create mode 100644 MAC/GCF/TM/test/tServer.cc
 create mode 100644 MAC/GCF/TM/test/tServer.h
 create mode 100644 MAC/GCF/TM/test/tStateResult.cc
 create mode 100644 MAC/GCF/TM/test/tStateResult.h

diff --git a/MAC/APL/CEPCU/configure.in b/MAC/APL/CEPCU/configure.in
index dd04c10b369..f559b22c896 100644
--- a/MAC/APL/CEPCU/configure.in
+++ b/MAC/APL/CEPCU/configure.in
@@ -75,6 +75,7 @@ AC_OUTPUT(
 src/Makefile
 src/ApplController/Makefile
 src/CEPlogProcessor/Makefile
+src/BGPlogProcessor/Makefile
 src/OnlineControl/Makefile
 dnl src/OfflineControl/Makefile
 Makefile
diff --git a/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.cc b/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.cc
new file mode 100644
index 00000000000..95ee9fa602a
--- /dev/null
+++ b/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.cc
@@ -0,0 +1,244 @@
+//#  BGPlogProcessor.cc: Captures cout datastreams of CEP programs
+//#
+//#  Copyright (C) 2009
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  This program is free software; you can redistribute it and/or modify
+//#  it under the terms of the GNU General Public License as published by
+//#  the Free Software Foundation; either version 2 of the License, or
+//#  (at your option) any later version.
+//#
+//#  This program is distributed in the hope that it will be useful,
+//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//#  GNU General Public License for more details.
+//#
+//#  You should have received a copy of the GNU General Public License
+//#  along with this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+//# Always #include <lofar_config.h> first!
+#include <lofar_config.h>
+
+//# Includes
+#include <Common/LofarLogger.h>
+#include <Common/LofarLocators.h>
+#include <Common/ParameterSet.h>
+#include <Common/SystemUtil.h>
+#include "BGPlogProcessor.h"
+
+namespace LOFAR {
+  using namespace GCF::TM;
+  namespace APL {
+
+//
+// BGPlogProcessor(name)
+//
+BGPlogProcessor::BGPlogProcessor(const string&	progName) :
+	GCFTask		((State)&BGPlogProcessor::startListener, progName),
+	itsListener	(0)
+{
+	// prepare TCP port to accept connections on
+	itsListener = new GCFTCPPort (*this, "BGPlogger:v1_0", GCFPortInterface::MSPP, 0);
+	ASSERTSTR(itsListener, "Cannot allocate listener port");
+	itsListener->setPortNumber(globalParameterSet()->getInt("BGPlogProcessor.portNr"));
+
+	itsBufferSize = globalParameterSet()->getInt("BGPlogProcessor.bufferSize", 1024);
+}
+
+//
+// ~BGPlogProcessor()
+//
+BGPlogProcessor::~BGPlogProcessor()
+{
+	if (itsListener) { 
+		delete itsListener; 
+	}
+}
+
+//
+// startListener(event, port)
+//
+GCFEvent::TResult BGPlogProcessor::startListener(GCFEvent&	event, GCFPortInterface&	port)
+{
+	LOG_DEBUG_STR("startListener:" << eventName(event) << "@" << port.getName());
+
+	switch (event.signal) {
+	case F_INIT:
+		itsListener->autoOpen(0, 10, 2);	// report within 10 seconds.
+		break;
+
+	case F_CONNECTED:
+		LOG_DEBUG("Listener is started, going to operational mode");
+		TRAN (BGPlogProcessor::operational);
+		break;
+
+	case F_DISCONNECTED:
+		LOG_FATAL_STR("Cannot open the listener on port " << itsListener->getPortNumber() << ". Quiting!");
+		GCFScheduler::instance()->stop();
+		break;
+	}
+
+	return (GCFEvent::HANDLED);
+}
+
+//
+// operational(event, port)
+//
+GCFEvent::TResult BGPlogProcessor::operational(GCFEvent& event, GCFPortInterface& port)
+{
+	LOG_DEBUG_STR("operational:" << eventName(event) << "@" << port.getName());
+
+	switch (event.signal) {
+	case F_ACCEPT_REQ:
+		_handleConnectionRequest();
+		break;
+
+	case F_CONNECTED:
+		break;
+
+	case F_DISCONNECTED:
+		port.close();
+	case F_DATAIN:
+		_handleDataStream(&port);
+		break;
+	}
+
+	return (GCFEvent::HANDLED);
+}
+
+//
+// _handleConnectionRequest()
+//
+void BGPlogProcessor::_handleConnectionRequest()
+{
+	GCFTCPPort* 	pNewClient = new GCFTCPPort();
+	ASSERT(pNewClient);
+
+	pNewClient->init(*this, "newClient", GCFPortInterface::SPP, 0, true);
+	if (!itsListener->accept(*pNewClient)) {
+		LOG_WARN("Connection with new client went wrong");
+		return;
+	}
+
+	// give stream its own buffer.
+	streamBuffer_t		stream;
+	stream.socket	= pNewClient;
+	stream.buffer 	= (char*)malloc(itsBufferSize);
+	stream.inPtr  	= 0;
+	stream.outPtr 	= 0;
+	itsLogStreams[pNewClient] = stream;
+	LOG_INFO_STR("Added new client to my admin");
+}
+
+//
+// _handleDataStream(sid)
+//
+void BGPlogProcessor::_handleDataStream(GCFPortInterface*	port)
+{
+	// read in the new bytes
+	streamBuffer_t	stream		= itsLogStreams[port];
+	LOG_DEBUG_STR("handleDataStream:in=" << stream.inPtr << ", out=" << stream.outPtr);
+	int	newBytes = stream.socket->recv(stream.buffer + stream.inPtr, itsBufferSize - stream.inPtr);
+	LOG_DEBUG_STR("received " << newBytes << " new bytes");
+	if (newBytes < 0) {
+//		LOG_ERROR_STR("read on socket " << sid << " returned " << newBytes << ". Closing connection");
+		free (stream.buffer);
+		stream.socket->close();
+		free(stream.socket);
+		itsLogStreams.erase(port);
+		return;
+	}
+//	LOG_DEBUG_STR("Received " << newBytes << " bytes at sid " << sid);
+	stream.inPtr += newBytes;
+	
+	// process as much data as possible from the buffer.
+	for (int i = stream.outPtr; i <= stream.inPtr; i++) {
+		if (stream.buffer[i] != '\n') {
+			continue;
+		}
+
+		stream.buffer[i] = '\0';
+//		LOG_INFO(formatString("SID %d:>%s<", sid, &(stream.buffer[stream.outPtr])));
+		LOG_INFO(formatString("(%d,%d)>%s<", stream.outPtr, i, &(stream.buffer[stream.outPtr])));
+		_processLogLine(&(stream.buffer[stream.outPtr]));
+		stream.outPtr = i+1;
+		if (stream.outPtr >= stream.inPtr) {	// All received bytes handled?
+			LOG_DEBUG("Reset of read/write pointers");
+			stream.inPtr = 0;
+			stream.outPtr = 0;
+			itsLogStreams[port] = stream;	// copy changes back to admin
+			return;
+		} 
+	}
+
+	if (stream.outPtr > (int)(0.5*itsBufferSize)) {
+		// When buffer becomes full shift leftovers to the left.
+		LOG_DEBUG_STR("move with: " << stream.inPtr << ", " << stream.outPtr);
+		memmove (stream.buffer, stream.buffer + stream.outPtr, (stream.inPtr - stream.outPtr + 1));
+		stream.inPtr -= stream.outPtr;
+		stream.outPtr = 0;
+	}
+
+	itsLogStreams[port] = stream; // copy changes back to admin
+}
+
+//
+// _getProcessID(char*)
+//
+string BGPlogProcessor::_getProcessID(char*	cString)
+{
+	char	delimiter[]="|";
+	char*	result = strtok(cString, delimiter);	// get loglevel
+	if (!result) {		// unknown line skip it.
+		LOG_DEBUG("No loglevel found");
+		return ("");
+	}
+
+	if (!(result = strtok(NULL, delimiter))) {		// get processID
+		LOG_DEBUG("No processID found");
+		return ("");
+	}
+	
+	return (result);
+}
+
+
+//
+// _processLogLine(char*)
+//
+void BGPlogProcessor::_processLogLine(char*		cString)
+{
+	string processName(_getProcessID(cString));
+	LOG_DEBUG_STR("Processname=" << processName);
+	if (processName.empty()) {
+		return;
+	}
+
+	// TODO: switch on processName to right analysis routine
+
+	char*	logMsg = strtok(NULL, "|");
+	char*	result;
+
+	if ((result = strstr(logMsg, " late: "))) {
+		float	late;
+		sscanf(result, " late: %f ", &late);	// TODO check result
+		LOG_DEBUG_STR("Late: " << late);
+	}
+	else if ((result = strstr(logMsg, "ION->CN:"))) {
+		float	ioTime;
+		sscanf(result, "ION->CN:%f", &ioTime);	// TODO check result
+		LOG_DEBUG_STR("ioTime: " << ioTime);
+	}
+	else if ((result = strstr(logMsg, "received ["))) {
+		int	blocks0(0), blocks1(0), blocks2(0), blocks3(0);
+		sscanf(result, "received [%d,%d,%d,%d]", &blocks0, &blocks1, &blocks2, &blocks3);	// TODO check result
+		LOG_DEBUG(formatString("blocks: %d, %d, %d, %d", blocks0, blocks1, blocks2, blocks3));
+	}
+}
+
+  } // namespace APL
+} // namespace LOFAR
diff --git a/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.conf b/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.conf
new file mode 100644
index 00000000000..49b98e69176
--- /dev/null
+++ b/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.conf
@@ -0,0 +1,5 @@
+#
+# Parameter file for CEPlogProcessor
+#
+BGPlogProcessor.portNr		=	24500
+BGPlogProcessor.bufferSize	=	1024
diff --git a/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.h b/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.h
new file mode 100644
index 00000000000..4de11d41b95
--- /dev/null
+++ b/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessor.h
@@ -0,0 +1,92 @@
+//#  BGPlogProcessor.h: Daemon for catching CEP cout log streams
+//#
+//#  Copyright (C) 2009
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  This program is free software; you can redistribute it and/or modify
+//#  it under the terms of the GNU General Public License as published by
+//#  the Free Software Foundation; either version 2 of the License, or
+//#  (at your option) any later version.
+//#
+//#  This program is distributed in the hope that it will be useful,
+//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//#  GNU General Public License for more details.
+//#
+//#  You should have received a copy of the GNU General Public License
+//#  along with this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  Note: This source is read best with tabstop 4.
+//#
+//#  $Id$
+
+#ifndef LOFAR_APL_BGPLOGPROCESSOR_H
+#define LOFAR_APL_BGPLOGPROCESSOR_H
+
+// \file
+// Daemon for launching Application Controllers
+
+//# Never #include <config.h> or #include <lofar_config.h> in a header file!
+//# Includes
+#include <GCF/TM/GCF_Control.h>
+
+namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFTCPPort;
+  using GCF::TM::GCFPortInterface;
+  namespace APL {
+// \addtogroup CEPCU
+// @{
+
+
+// The BGPlogProcessor class implements a small daemon that ...
+class BGPlogProcessor : public GCFTask
+{
+public:
+	// Creates an BGPlogProcessor object that start listening on the port mentioned
+	// in the ParameterSet.
+	explicit BGPlogProcessor(const string&	progName);
+
+	// Destructor.
+	~BGPlogProcessor();
+
+	// its processing states
+	GCFEvent::TResult startListener(GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult operational  (GCFEvent& e, GCFPortInterface& p);
+	
+private:
+	// Copying is not allowed
+	BGPlogProcessor(const BGPlogProcessor&	that);
+	BGPlogProcessor& operator=(const BGPlogProcessor& that);
+
+	void	_handleConnectionRequest();
+	void	_handleDataStream(GCFPortInterface*	port);
+	string	_getProcessID	 (char*	cString);
+	void 	_processLogLine  (char*	cString);
+
+	//# --- Datamembers --- 
+	// The listener socket to receive the requests on.
+	GCFTCPPort*		itsListener;
+
+	// internal structure for admin for 1 stream
+	typedef struct {
+		GCFTCPPort*	socket;
+		char*		buffer;
+		int			inPtr;
+		int			outPtr;
+	} streamBuffer_t;
+
+	// Map containing all the streambuffers.
+	map<GCFPortInterface*, streamBuffer_t>	itsLogStreams;
+
+	// buffersize of the streambuffers.
+	int		itsBufferSize;
+};
+
+// @} addgroup
+  } // namespace APL
+} // namespace LOFAR
+
+#endif
diff --git a/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessorMain.cc b/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessorMain.cc
new file mode 100644
index 00000000000..8349db8ff4f
--- /dev/null
+++ b/MAC/APL/CEPCU/src/BGPlogProcessor/BGPlogProcessorMain.cc
@@ -0,0 +1,59 @@
+//#  BGPlogProcessorMain.cc: Deamon to dispatch the BG/P logging to PVSS
+//#
+//#  Copyright (C) 2009
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  This program is free software; you can redistribute it and/or modify
+//#  it under the terms of the GNU General Public License as published by
+//#  the Free Software Foundation; either version 2 of the License, or
+//#  (at your option) any later version.
+//#
+//#  This program is distributed in the hope that it will be useful,
+//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//#  GNU General Public License for more details.
+//#
+//#  You should have received a copy of the GNU General Public License
+//#  along with this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+//# Always #include <lofar_config.h> first!
+#include <lofar_config.h>
+
+//# Includes
+#include <Common/LofarLogger.h>
+#include <Common/LofarLocators.h>
+#include <GCF/TM/GCF_Scheduler.h>
+#include "BGPlogProcessor.h"
+
+using namespace LOFAR;
+using namespace GCF::TM;
+using namespace LOFAR::APL;
+
+//
+// MAIN (parameterfile)
+//
+int main (int argc, char* argv[]) 
+{
+	try {
+		GCFScheduler::instance()->init(argc, argv);
+
+		BGPlogProcessor		loggerTask("BGPlogger");
+		loggerTask.start(); // make initial transition
+
+		GCFScheduler::instance()->run();
+
+		LOG_INFO_STR("Shutting down: " << argv[0]);
+	}
+	catch (LOFAR::Exception&	ex) {
+		LOG_FATAL_STR("Caught exception: " << ex);
+		LOG_FATAL     ("Terminated by exception!");
+		return (1);
+	}
+
+	LOG_INFO("Terminated normally");
+	return (0);
+}
diff --git a/MAC/APL/CEPCU/src/BGPlogProcessor/Makefile.am b/MAC/APL/CEPCU/src/BGPlogProcessor/Makefile.am
new file mode 100644
index 00000000000..5d69c4449af
--- /dev/null
+++ b/MAC/APL/CEPCU/src/BGPlogProcessor/Makefile.am
@@ -0,0 +1,15 @@
+
+bin_PROGRAMS			= BGPlogProcessor
+
+sysconf_DATA			= BGPlogProcessor.conf
+
+BGPlogProcessorHEADERS	= BGPlogProcessor.h
+
+noinst_HEADERS 			= $(BGPlogProcessorHEADERS)
+
+BGPlogProcessor_SOURCES			= BGPlogProcessor.cc \
+								  BGPlogProcessorMain.cc
+BGPlogProcessor_DEPENDENCIES	= $(LOFAR_DEPEND) $(BGPlogProcessorHEADERS)
+BGPlogProcessor_LDADD       	=
+
+include $(top_srcdir)/Makefile.common
diff --git a/MAC/APL/CEPCU/src/Makefile.am b/MAC/APL/CEPCU/src/Makefile.am
index dfc5968928c..45f37006a14 100644
--- a/MAC/APL/CEPCU/src/Makefile.am
+++ b/MAC/APL/CEPCU/src/Makefile.am
@@ -1,6 +1,6 @@
 pkginclude_HEADERS = Package__Version.h
 
-SUBDIRS = ApplController CEPlogProcessor 
+SUBDIRS = ApplController CEPlogProcessor BGPlogProcessor
 if HAVE_PVSS
   SUBDIRS += OnlineControl # OfflineControl 
 endif
diff --git a/MAC/APL/CEPCU/src/OnlineControl/CEPApplMgr.cc b/MAC/APL/CEPCU/src/OnlineControl/CEPApplMgr.cc
index 152364e6826..f2b50def660 100644
--- a/MAC/APL/CEPCU/src/OnlineControl/CEPApplMgr.cc
+++ b/MAC/APL/CEPCU/src/OnlineControl/CEPApplMgr.cc
@@ -23,9 +23,11 @@
 #include <lofar_config.h>
 #include <Common/StringUtil.h>
 #include <APL/APLCommon/Controller_Protocol.ph>
+#include <GCF/TM/GCF_Scheduler.h>
 #include "CEPApplMgr.h"
 
 namespace LOFAR {
+  using namespace GCF::TM;
   using namespace ACC::ALC;
   using namespace APLCommon;
   namespace CEPCU {
@@ -56,7 +58,7 @@ CEPApplMgr::CEPApplMgr(CEPApplMgrInterface& interface,
 //
 CEPApplMgr::~CEPApplMgr()
 {
-	GCFTask::deregisterHandler(*this);
+	GCFScheduler::instance()->deregisterHandler(*this);
 }
 
 //
diff --git a/MAC/APL/CEPCU/src/OnlineControl/OnlineControl.cc b/MAC/APL/CEPCU/src/OnlineControl/OnlineControl.cc
index a3e59369cb1..6787f2f3ef8 100644
--- a/MAC/APL/CEPCU/src/OnlineControl/OnlineControl.cc
+++ b/MAC/APL/CEPCU/src/OnlineControl/OnlineControl.cc
@@ -512,7 +512,7 @@ GCFEvent::TResult OnlineControl::finishing_state(GCFEvent& event, GCFPortInterfa
 	}
 
 	case F_TIMER:
-		GCFTask::stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
diff --git a/MAC/APL/CEPCU/src/OnlineControl/OnlineControlMain.cc b/MAC/APL/CEPCU/src/OnlineControl/OnlineControlMain.cc
index aca7434ed4b..fa0eef0178a 100644
--- a/MAC/APL/CEPCU/src/OnlineControl/OnlineControlMain.cc
+++ b/MAC/APL/CEPCU/src/OnlineControl/OnlineControlMain.cc
@@ -37,7 +37,7 @@ int main(int argc, char* argv[])
 		return(-1);
 	}
 
-	GCFTask::init(argc, argv, "OnlineControl");
+	GCFScheduler::instance()->init(argc, argv, "OnlineControl");
 
 	ParentControl*	pc = ParentControl::instance();
 	pc->start();	// make initial transition
@@ -45,7 +45,7 @@ int main(int argc, char* argv[])
 	OnlineControl	olc(argv[1]);
 	olc.start(); 	// make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/APL/CUDaemons/src/CTStartDaemon/CTStartDaemonMain.cc b/MAC/APL/CUDaemons/src/CTStartDaemon/CTStartDaemonMain.cc
index f779071bfc6..e6f39a6ecdb 100644
--- a/MAC/APL/CUDaemons/src/CTStartDaemon/CTStartDaemonMain.cc
+++ b/MAC/APL/CUDaemons/src/CTStartDaemon/CTStartDaemonMain.cc
@@ -31,7 +31,7 @@ int main(int argc, char* argv[])
 {
 //	signal (SIGCHLD, SIG_IGN);
 
-	GCFTask::init(argc, argv, "CTStartDaemon");
+	GCFScheduler::instance()->init(argc, argv, "CTStartDaemon");
 
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_Daemons_CTStartDaemon");
 
@@ -39,7 +39,7 @@ int main(int argc, char* argv[])
 
 	sd.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/CUDaemons/src/LogClient/LogClientMain.cc b/MAC/APL/CUDaemons/src/LogClient/LogClientMain.cc
index 453b09cc4f6..ca479eb9473 100644
--- a/MAC/APL/CUDaemons/src/LogClient/LogClientMain.cc
+++ b/MAC/APL/CUDaemons/src/LogClient/LogClientMain.cc
@@ -30,14 +30,14 @@ using namespace LOFAR::CUDaemons;
 
 int main(int argc, char *argv[])
 {
-	GCFTask::init(argc, argv, "LogClient");
+	GCFScheduler::instance()->init(argc, argv, "LogClient");
 
 //	LOG_INFO("MACProcessScope: LOFAR_PermSW_LogClient");
 
 	LogClient LC("LogClient"); 
 	LC.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/APL/CUDaemons/src/ServiceBroker/ServiceBrokerMain.cc b/MAC/APL/CUDaemons/src/ServiceBroker/ServiceBrokerMain.cc
index b8adbf00712..ad70a6ec896 100644
--- a/MAC/APL/CUDaemons/src/ServiceBroker/ServiceBrokerMain.cc
+++ b/MAC/APL/CUDaemons/src/ServiceBroker/ServiceBrokerMain.cc
@@ -32,7 +32,7 @@ using namespace LOFAR::CUDaemons;
 
 int main(int argc, char *argv[])
 {
-  GCFTask::init(argc, argv, "ServiceBroker");
+  GCFScheduler::instance()->init(argc, argv, "ServiceBroker");
   
   LOG_INFO("MACProcessScope: LOFAR_PermSW_Daemons_ServiceBroker");
 
@@ -40,7 +40,7 @@ int main(int argc, char *argv[])
   
   sb.start(); // make initial transition
   
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 
   return 0;
 }
diff --git a/MAC/APL/CURTDBDaemons/src/KeyValueLogger/KeyValueLogger.h b/MAC/APL/CURTDBDaemons/src/KeyValueLogger/KeyValueLogger.h
index 11ce7cebbc8..7cd767b924e 100644
--- a/MAC/APL/CURTDBDaemons/src/KeyValueLogger/KeyValueLogger.h
+++ b/MAC/APL/CURTDBDaemons/src/KeyValueLogger/KeyValueLogger.h
@@ -39,7 +39,7 @@
 // Avoid 'using namespace' in headerfiles
 
 namespace LOFAR {
-  using namespace MACIO;
+  using MACIO::GCFEvent;
   namespace GCF {  
     namespace RTDBDaemons {
 
@@ -65,9 +65,9 @@ private:
 	GCFEvent::TResult operational (GCFEvent& e, TM::GCFPortInterface& p);
 
 	// helper methods
-	void	_registerClient(GCFPortInterface&	port,
+	void	_registerClient(TM::GCFPortInterface&	port,
 						    const string&		name, uint32		obsID);
-	void    _registerFailure(GCFPortInterface&	port);
+	void    _registerFailure(TM::GCFPortInterface&	port);
 
 	// data members        
 	TM::GCFTCPPort*			itsListener;	// application inpt
diff --git a/MAC/APL/CURTDBDaemons/src/KeyValueLogger/KeyValueLoggerMain.cc b/MAC/APL/CURTDBDaemons/src/KeyValueLogger/KeyValueLoggerMain.cc
index 0472c5869d9..d6bbc92522e 100644
--- a/MAC/APL/CURTDBDaemons/src/KeyValueLogger/KeyValueLoggerMain.cc
+++ b/MAC/APL/CURTDBDaemons/src/KeyValueLogger/KeyValueLoggerMain.cc
@@ -30,13 +30,13 @@ using namespace LOFAR::GCF::RTDBDaemons;
 
 int main(int argc, char *argv[])
 {
-	GCFTask::init(argc, argv, "KeyValueLogger");
+	GCFScheduler::instance()->init(argc, argv, "KeyValueLogger");
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_Daemons_KVLogger");
 
 	KeyValueLogger kvl("KeyValueLogger"); 
 	kvl.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessor.cc b/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessor.cc
index 788f05617d3..48e5cf2df22 100644
--- a/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessor.cc
+++ b/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessor.cc
@@ -175,10 +175,12 @@ GCFEvent::TResult LogProcessor::operational(GCFEvent&			event,
 		if (&port == itsListener) {
 			client->init(*this, "application", GCFPortInterface::SPP, 0, true);
 			itsListener->accept(*client);
+			LOG_DEBUG("New connection with an application");
 		}
 		if (&port == itsBackDoor) {
 			client->init(*this, "LogClient", GCFPortInterface::SPP, LOG_PROTOCOL);
 			itsBackDoor->accept(*client);
+			LOG_DEBUG("New connection with a LogCLient");
 		}
 	}
 	break;
@@ -242,6 +244,7 @@ GCFEvent::TResult LogProcessor::operational(GCFEvent&			event,
 
 		// Construct an InternalLoggingEvent from the buffer
 		spi::InternalLoggingEvent l4cpLogEvent = readFromBuffer(buffer);           
+		LOG_TRACE_RTTI_STR("IN:" << l4cpLogEvent.getMessage());
 
 		// Has client a known DP?
 		string 	PVSSdp(_searchClientDP(l4cpLogEvent, port));
diff --git a/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessor.h b/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessor.h
index 7081e50fde3..945270eaf23 100644
--- a/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessor.h
+++ b/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessor.h
@@ -39,7 +39,7 @@
 // Avoid 'using namespace' in headerfiles
 
 namespace LOFAR {
-  using namespace MACIO;
+  using MACIO::GCFEvent;
   namespace GCF {  
     namespace RTDBDaemons {
 
@@ -58,8 +58,8 @@ private:
 	bool _readFromPortData(TM::GCFPortInterface& 				port, 
 						   log4cplus::helpers::SocketBuffer&	buf);
 	string _searchClientDP(log4cplus::spi::InternalLoggingEvent&	logEvent,
-						   GCFPortInterface&						port);
-	void _registerFailure (GCFPortInterface&	port);
+						   TM::GCFPortInterface&						port);
+	void _registerFailure (TM::GCFPortInterface&	port);
 
 	// data members        
 	TM::GCFTCPPort*			itsListener;	// application inpt
diff --git a/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessorMain.cc b/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessorMain.cc
index cfa79d6ce8d..a8bb97daa58 100644
--- a/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessorMain.cc
+++ b/MAC/APL/CURTDBDaemons/src/LogProcessor/LogProcessorMain.cc
@@ -30,13 +30,13 @@ using namespace LOFAR::GCF::RTDBDaemons;
 
 int main(int argc, char *argv[])
 {
-	GCFTask::init(argc, argv, "LogProcessor");
+	GCFScheduler::instance()->init(argc, argv, "LogProcessor");
 //	LOG_INFO("MACProcessScope: LOFAR_PermSW_Daemons_LogProcessor");
 
 	LogProcessor clp("LogProcessor"); 
 	clp.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/APL/CURTDBDaemons/src/SASGateway/SASGatewayMain.cc b/MAC/APL/CURTDBDaemons/src/SASGateway/SASGatewayMain.cc
index a0c08340ea7..34035d6f653 100644
--- a/MAC/APL/CURTDBDaemons/src/SASGateway/SASGatewayMain.cc
+++ b/MAC/APL/CURTDBDaemons/src/SASGateway/SASGatewayMain.cc
@@ -30,13 +30,13 @@ using namespace LOFAR::GCF::RTDBDaemons;
 
 int main(int argc, char *argv[])
 {
-	GCFTask::init(argc, argv, "SASGateway");
+	GCFScheduler::instance()->init(argc, argv, "SASGateway");
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_Daemons_SASGateway");
 
 	SASGateway SGW("SASGateway"); 
 	SGW.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/APL/CURTDBDaemons/src/SoftwareMonitor/SoftwareMonitor.h b/MAC/APL/CURTDBDaemons/src/SoftwareMonitor/SoftwareMonitor.h
index 8ccf6d72c6e..c87dec0633a 100644
--- a/MAC/APL/CURTDBDaemons/src/SoftwareMonitor/SoftwareMonitor.h
+++ b/MAC/APL/CURTDBDaemons/src/SoftwareMonitor/SoftwareMonitor.h
@@ -39,6 +39,7 @@ namespace LOFAR {
 	using	MACIO::GCFEvent;
 	using	GCF::TM::GCFTimerPort;
 	using	GCF::TM::GCFTCPPort;
+	using	GCF::TM::GCFITCPort;
 	using	GCF::TM::GCFPortInterface;
 	using	GCF::TM::GCFTask;
 	using	GCF::RTDB::RTDBPropertySet;
diff --git a/MAC/APL/CURTDBDaemons/src/SoftwareMonitor/SoftwareMonitorMain.cc b/MAC/APL/CURTDBDaemons/src/SoftwareMonitor/SoftwareMonitorMain.cc
index e1cd9070652..01485d93388 100644
--- a/MAC/APL/CURTDBDaemons/src/SoftwareMonitor/SoftwareMonitorMain.cc
+++ b/MAC/APL/CURTDBDaemons/src/SoftwareMonitor/SoftwareMonitorMain.cc
@@ -37,7 +37,7 @@ using namespace LOFAR::RTDBDaemons;
 int main(int argc, char* argv[])
 {
 	// args: cntlrname, parentHost, parentService
-	GCFTask::init(argc, argv, "SoftwareMonitor");
+	GCFScheduler::instance()->init(argc, argv, "SoftwareMonitor");
 
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_SoftwareMonitor");
 	LOG_INFO(Version::getInfo<CURTDBDaemonsVersion>("SoftwareMonitor"));
@@ -51,13 +51,13 @@ int main(int argc, char* argv[])
 	swm->start();
 
 	// ok, we have something to do, do it.
-	GCFTask::setDelayedQuit(true);	// we need a clean shutdown
-	GCFTask::run();	// until stop was called
+	GCFScheduler::instance()->setDelayedQuit(true);	// we need a clean shutdown
+	GCFScheduler::instance()->run();	// until stop was called
 
 	swm->quit();		// let task quit nicely
 
 	double	postRunTime = globalParameterSet()->getDouble("closingDelay", 1.5);
-	GCFTask::run(postRunTime);	// let processes die.
+	GCFScheduler::instance()->run(postRunTime);	// let processes die.
 
 	return (0);
 }
diff --git a/MAC/APL/MainCU/src/MACScheduler/MACScheduler.cc b/MAC/APL/MainCU/src/MACScheduler/MACScheduler.cc
index af3dbb4d1b9..910ac3044ce 100644
--- a/MAC/APL/MainCU/src/MACScheduler/MACScheduler.cc
+++ b/MAC/APL/MainCU/src/MACScheduler/MACScheduler.cc
@@ -513,7 +513,7 @@ GCFEvent::TResult MACScheduler::finishing_state(GCFEvent& event, GCFPortInterfac
 	}
   
     case F_TIMER:
-      GCFTask::stop();
+      GCFScheduler::instance()->stop();
       break;
     
 	default:
diff --git a/MAC/APL/MainCU/src/MACScheduler/MACSchedulerMain.cc b/MAC/APL/MainCU/src/MACScheduler/MACSchedulerMain.cc
index d20a78047c7..0c166979748 100644
--- a/MAC/APL/MainCU/src/MACScheduler/MACSchedulerMain.cc
+++ b/MAC/APL/MainCU/src/MACScheduler/MACSchedulerMain.cc
@@ -31,7 +31,7 @@ using namespace LOFAR::APLCommon;
 
 int main(int argc, char* argv[])
 {
-	GCFTask::init(argc, argv, "MACScheduler");
+	GCFScheduler::instance()->init(argc, argv, "MACScheduler");
 
 	ChildControl*	cc = ChildControl::instance();
 	cc->start();	// make initial transition
@@ -39,7 +39,7 @@ int main(int argc, char* argv[])
 	MACScheduler	ms;
 	ms.start(); // make initial transition
   
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/MainCU/src/MACScheduler/ObsClaimer.h b/MAC/APL/MainCU/src/MACScheduler/ObsClaimer.h
index db6975998c2..4b2efec4dca 100644
--- a/MAC/APL/MainCU/src/MACScheduler/ObsClaimer.h
+++ b/MAC/APL/MainCU/src/MACScheduler/ObsClaimer.h
@@ -43,6 +43,7 @@
 
 namespace LOFAR {
 	using	MACIO::GCFEvent;
+	using	GCF::TM::GCFITCPort;
 	using	GCF::TM::GCFTimerPort;
 	using	GCF::TM::GCFPortInterface;
 	using	GCF::TM::GCFTask;
diff --git a/MAC/APL/MainCU/src/ObservationControl/ObservationControl.cc b/MAC/APL/MainCU/src/ObservationControl/ObservationControl.cc
index 4093a4bbc1b..f5c00bcafbd 100644
--- a/MAC/APL/MainCU/src/ObservationControl/ObservationControl.cc
+++ b/MAC/APL/MainCU/src/ObservationControl/ObservationControl.cc
@@ -578,7 +578,7 @@ GCFEvent::TResult ObservationControl::finishing_state(GCFEvent& 		event,
 	}
   
     case F_TIMER:
-      GCFTask::stop();
+      GCFScheduler::instance()->stop();
       break;
     
 	default:
diff --git a/MAC/APL/MainCU/src/ObservationControl/ObservationControlMain.cc b/MAC/APL/MainCU/src/ObservationControl/ObservationControlMain.cc
index 53edb161c67..367967ec07b 100644
--- a/MAC/APL/MainCU/src/ObservationControl/ObservationControlMain.cc
+++ b/MAC/APL/MainCU/src/ObservationControl/ObservationControlMain.cc
@@ -32,7 +32,7 @@ using namespace LOFAR::APLCommon;
 int main(int argc, char* argv[])
 {
 	// args: cntlrname, parentHost, parentService
-	GCFTask::init(argc, argv, argv[1]);
+	GCFScheduler::instance()->init(argc, argv, argv[1]);
 
 	ChildControl*	cc = ChildControl::instance();
 	cc->start();	// make initial transition
@@ -43,7 +43,7 @@ int main(int argc, char* argv[])
 	ObservationControl	oc(argv[1]);
 	oc.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/PAC/BeamServer/src/BeamServer.cc b/MAC/APL/PAC/BeamServer/src/BeamServer.cc
index be4f6d48825..6cc71edcaf4 100644
--- a/MAC/APL/PAC/BeamServer/src/BeamServer.cc
+++ b/MAC/APL/PAC/BeamServer/src/BeamServer.cc
@@ -1060,7 +1060,7 @@ GCFEvent::TResult BeamServer::recall(GCFPortInterface& /*p*/)
 		LOG_DEBUG_STR(">>> recalling event " << m_deferred_queue.size() << " <<<");
 		pair<char*, GCFPortInterface*> port_event = m_deferred_queue.front();
 		m_deferred_queue.pop_front();
-		status = dispatch(*(GCFEvent*)(port_event.first), *port_event.second);
+		status = doEvent(*(GCFEvent*)(port_event.first), *port_event.second);
 		delete [] port_event.first;
 	}
 	else {
diff --git a/MAC/APL/PAC/BeamServer/src/BeamServer.h b/MAC/APL/PAC/BeamServer/src/BeamServer.h
index 8eea36fd885..025bf3637d7 100644
--- a/MAC/APL/PAC/BeamServer/src/BeamServer.h
+++ b/MAC/APL/PAC/BeamServer/src/BeamServer.h
@@ -38,6 +38,11 @@
 #include <list>
 
 namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFPort;
+  using GCF::TM::GCFTCPPort;
+  using GCF::TM::GCFTimerPort;
+  using GCF::TM::GCFPortInterface;
   namespace BS {
 
 extern	int		g_bf_gain;
diff --git a/MAC/APL/PAC/BeamServer/src/BeamServerMain.cc b/MAC/APL/PAC/BeamServer/src/BeamServerMain.cc
index 990973d4299..b7a235feb9b 100644
--- a/MAC/APL/PAC/BeamServer/src/BeamServerMain.cc
+++ b/MAC/APL/PAC/BeamServer/src/BeamServerMain.cc
@@ -51,7 +51,7 @@ int main(int argc, char* argv[])
 		}
 	}
 
-	GCFTask::init(argc, argv, "BeamServer");
+	GCFScheduler::instance()->init(argc, argv, "BeamServer");
 
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_BeamServer");
 	LOG_INFO(formatString("Program %s has started", argv[0]));
@@ -73,7 +73,7 @@ int main(int argc, char* argv[])
 
 		beamserver.start(); // make initial transition
 
-		GCFTask::run();
+		GCFScheduler::instance()->run();
 	}
 	catch (Exception& e) {
 		LOG_FATAL_STR("Exception: " << e.text());
diff --git a/MAC/APL/PAC/BeamServer/src/beamctl.cc b/MAC/APL/PAC/BeamServer/src/beamctl.cc
index e11a0440059..0a294c4309c 100644
--- a/MAC/APL/PAC/BeamServer/src/beamctl.cc
+++ b/MAC/APL/PAC/BeamServer/src/beamctl.cc
@@ -26,6 +26,7 @@
 #include <APL/BS_Protocol/BS_Protocol.ph>
 #include <APL/RSP_Protocol/RCUSettings.h>
 #include <MACIO/MACServiceInfo.h>
+#include <GCF/TM/GCF_Control.h>
 #include <Common/LofarLocators.h>
 #include <Common/ParameterSet.h>
 
@@ -71,6 +72,7 @@ using namespace BS;
 using namespace RTC;
 using namespace CAL_Protocol;
 using namespace BS_Protocol;
+using namespace GCF::TM;
 
 beamctl::beamctl(string name,
 		 string parent,
@@ -347,7 +349,7 @@ GCFEvent::TResult beamctl::final(GCFEvent& e, GCFPortInterface& /*port*/)
   switch(e.signal)
   {
       case F_ENTRY:
-	  GCFTask::stop();
+	  GCFScheduler::instance()->stop();
 	  break;
       
       case F_EXIT:
@@ -470,7 +472,7 @@ static list<int> strtolist(const char* str, int max)
 void beamctl::mainloop()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
 int main(int argc, char** argv)
@@ -669,7 +671,7 @@ int main(int argc, char** argv)
   }
 
   cout << "Argument are ok, creating a task" << endl;
-  GCFTask::init(argc, argv, "beamctl");
+  GCFScheduler::instance()->init(argc, argv, "beamctl");
   LOG_INFO(formatString("Program %s has started", argv[0]));
 
   beamctl ctl("beamctl", array, rcus, subbands, beamlets, rcumode, longitude, latitude, type);
diff --git a/MAC/APL/PAC/BeamServer/src/beamctl.h b/MAC/APL/PAC/BeamServer/src/beamctl.h
index 319d698988c..16d5b9eb0a5 100644
--- a/MAC/APL/PAC/BeamServer/src/beamctl.h
+++ b/MAC/APL/PAC/BeamServer/src/beamctl.h
@@ -32,10 +32,11 @@
 #include <APL/RSP_Protocol/RCUSettings.h>
 #include <APL/BS_Protocol/BS_Protocol.ph>
 
-namespace LOFAR
-{
-  namespace BS
-    {
+namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFPort;
+  using GCF::TM::GCFPortInterface;
+  namespace BS {
 
       class beamctl : public GCFTask
 	{
diff --git a/MAC/APL/PAC/BeamServer/test/AVTStub.cc b/MAC/APL/PAC/BeamServer/test/AVTStub.cc
index 28cb7364953..74c4ace7639 100644
--- a/MAC/APL/PAC/BeamServer/test/AVTStub.cc
+++ b/MAC/APL/PAC/BeamServer/test/AVTStub.cc
@@ -601,7 +601,7 @@ GCFEvent::TResult AVTStub::done(GCFEvent& e, GCFPortInterface& /*port*/)
   switch(e.signal)
   {
   case F_ENTRY:
-    GCFTask::stop();
+    GCFScheduler::instance()->stop();
     break;
   }
 
@@ -611,12 +611,12 @@ GCFEvent::TResult AVTStub::done(GCFEvent& e, GCFPortInterface& /*port*/)
 void AVTStub::run()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
 int main(int argc, char** argv)
 {
-  GCFTask::init(argc, argv);
+  GCFScheduler::instance()->init(argc, argv);
 
   LOG_INFO(formatString("Program %s has started", argv[0]));
 
diff --git a/MAC/APL/PAC/BeamServer/test/BeamServerTest.cc b/MAC/APL/PAC/BeamServer/test/BeamServerTest.cc
index c60f5b96af7..ee710a39124 100644
--- a/MAC/APL/PAC/BeamServer/test/BeamServerTest.cc
+++ b/MAC/APL/PAC/BeamServer/test/BeamServerTest.cc
@@ -328,7 +328,7 @@ public:
 
 int main(int argc, char** argv)
 {
-	GCFTask::init(argc, argv);
+	GCFScheduler::instance()->init(argc, argv);
 
 	LOG_INFO(formatString("Program %s has started", argv[0]));
 
diff --git a/MAC/APL/PAC/BeamServer/test/EPATest.cc b/MAC/APL/PAC/BeamServer/test/EPATest.cc
index 617d0685cf5..69467dcd702 100644
--- a/MAC/APL/PAC/BeamServer/test/EPATest.cc
+++ b/MAC/APL/PAC/BeamServer/test/EPATest.cc
@@ -239,7 +239,7 @@ GCFEvent::TResult EPATest::done(GCFEvent& e, GCFPortInterface& /*port*/)
   switch(e.signal)
   {
   case F_ENTRY:
-    GCFTask::stop();
+    GCFScheduler::instance()->stop();
     break;
   }
 
@@ -249,12 +249,12 @@ GCFEvent::TResult EPATest::done(GCFEvent& e, GCFPortInterface& /*port*/)
 void EPATest::run()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
 int main(int argc, char** argv)
 {
-  GCFTask::init(argc, argv);
+  GCFScheduler::instance()->init(argc, argv);
 
   if (argc != 4) {
     cerr << "usage: EPATest subarrayname startbeamlet nbeamlets" << endl;
diff --git a/MAC/APL/PAC/BeamServer/test/SweepTest.cc b/MAC/APL/PAC/BeamServer/test/SweepTest.cc
index 200e804541d..df32b970fdb 100644
--- a/MAC/APL/PAC/BeamServer/test/SweepTest.cc
+++ b/MAC/APL/PAC/BeamServer/test/SweepTest.cc
@@ -230,7 +230,7 @@ GCFEvent::TResult SweepTest::done(GCFEvent& e, GCFPortInterface& /*port*/)
   switch(e.signal)
   {
   case F_ENTRY:
-    GCFTask::stop();
+    GCFScheduler::instance()->stop();
     break;
   }
 
@@ -240,13 +240,13 @@ GCFEvent::TResult SweepTest::done(GCFEvent& e, GCFPortInterface& /*port*/)
 void SweepTest::run()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
 int main(int argc, char** argv)
 {
   LOG_INFO(formatString("Program %s has started", argv[0]));
-  GCFTask::init(argc, argv);
+  GCFScheduler::instance()->init(argc, argv);
 
   cout << "Subband index to plot: ";
   char buf[32];
diff --git a/MAC/APL/PAC/CalServer/src/ACMProxy.cc b/MAC/APL/PAC/CalServer/src/ACMProxy.cc
index 3a0868919d6..f1f2e236ada 100644
--- a/MAC/APL/PAC/CalServer/src/ACMProxy.cc
+++ b/MAC/APL/PAC/CalServer/src/ACMProxy.cc
@@ -42,6 +42,7 @@ using namespace LOFAR;
 using namespace RSP_Protocol;
 using namespace CAL;
 using namespace RTC;
+using namespace GCF::TM;
 
 #define START_DELAY 4
 
diff --git a/MAC/APL/PAC/CalServer/src/ACMProxy.h b/MAC/APL/PAC/CalServer/src/ACMProxy.h
index b6c0c46aaf2..13043a08eef 100644
--- a/MAC/APL/PAC/CalServer/src/ACMProxy.h
+++ b/MAC/APL/PAC/CalServer/src/ACMProxy.h
@@ -31,7 +31,10 @@
 #include <GCF/TM/GCF_Control.h>
 
 namespace LOFAR {
-typedef		void*		memptr_t;
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFPort;
+  using GCF::TM::GCFPortInterface;
+  typedef		void*		memptr_t;
   namespace CAL {
 
     class ACMProxy : public GCFTask
diff --git a/MAC/APL/PAC/CalServer/src/CalServer.cc b/MAC/APL/PAC/CalServer/src/CalServer.cc
index 9819f935ff2..4e6b2718c67 100644
--- a/MAC/APL/PAC/CalServer/src/CalServer.cc
+++ b/MAC/APL/PAC/CalServer/src/CalServer.cc
@@ -66,6 +66,7 @@ using namespace CAL;
 using namespace RTC;
 using namespace RSP_Protocol;
 using namespace CAL_Protocol;
+using namespace GCF::TM;
 
 #define NPOL 2
 
@@ -869,7 +870,7 @@ int main(int argc, char** argv)
 		}
 	}
 
-	GCFTask::init(argc, argv, "CalServer");
+	GCFScheduler::instance()->init(argc, argv, "CalServer");
 
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_CalServer");
 
@@ -896,7 +897,7 @@ int main(int argc, char** argv)
 		cal.start();      // make initial transition
 		acmproxy.start(); // make initial transition
 
-		GCFTask::run();
+		GCFScheduler::instance()->run();
 	}
 	catch (Exception& e) {
 		LOG_ERROR_STR("Exception: " << e.text());
diff --git a/MAC/APL/PAC/CalServer/src/CalServer.h b/MAC/APL/PAC/CalServer/src/CalServer.h
index a0d1ef9bf0b..04cbdb5f83a 100644
--- a/MAC/APL/PAC/CalServer/src/CalServer.h
+++ b/MAC/APL/PAC/CalServer/src/CalServer.h
@@ -37,6 +37,10 @@
 #include <AMCBase/ConverterClient.h>
 
 namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFPort;
+  using GCF::TM::GCFTCPPort;
+  using GCF::TM::GCFPortInterface;
   namespace CAL {
 
     class CalibrationAlgorithm;
diff --git a/MAC/APL/PAC/CalServer/src/SubArraySubscription.h b/MAC/APL/PAC/CalServer/src/SubArraySubscription.h
index 435ec432244..88a9f13ca91 100644
--- a/MAC/APL/PAC/CalServer/src/SubArraySubscription.h
+++ b/MAC/APL/PAC/CalServer/src/SubArraySubscription.h
@@ -31,6 +31,7 @@
 #include <Common/lofar_bitset.h>
 
 namespace LOFAR {
+  using GCF::TM::GCFPortInterface;
   class RTC::Subject; // forward declaration
   namespace CAL {
     class SubArray; // forward declaration
diff --git a/MAC/APL/PAC/CalServer/src/calinfo.cc b/MAC/APL/PAC/CalServer/src/calinfo.cc
index 48311495dbc..dcd2c98d522 100644
--- a/MAC/APL/PAC/CalServer/src/calinfo.cc
+++ b/MAC/APL/PAC/CalServer/src/calinfo.cc
@@ -121,7 +121,7 @@ GCFEvent::TResult	calinfo::getInfo(GCFEvent&	event, GCFPortInterface&	port)
 }
 
 GCFEvent::TResult	calinfo::finish(GCFEvent&	event, GCFPortInterface&	port) {
-	GCFTask::stop();
+	GCFScheduler::instance()->stop();
 	return (GCFEvent::HANDLED);
 }
 
@@ -143,13 +143,13 @@ int main(int	argc,	char*	argv[])
 		saName = argv[1];
 	}
 
-	GCFTask::init(argc, argv);
+	GCFScheduler::instance()->init(argc, argv);
 	LOG_INFO(formatString("Program %s has started", argv[0]));
 
 	CAL::calinfo		ciTask(saName);
 	ciTask.start();
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/APL/PAC/CalServer/src/calinfo.h b/MAC/APL/PAC/CalServer/src/calinfo.h
index cda562f09b3..df98b39b91c 100644
--- a/MAC/APL/PAC/CalServer/src/calinfo.h
+++ b/MAC/APL/PAC/CalServer/src/calinfo.h
@@ -34,6 +34,8 @@
 
 namespace LOFAR {
   using GCF::TM::GCFTask;
+  using GCF::TM::GCFPortInterface;
+  using GCF::TM::GCFTCPPort;
   namespace CAL {
 
 // \addtogroup CAL
diff --git a/MAC/APL/PAC/CalServer/test/CalTest.cc b/MAC/APL/PAC/CalServer/test/CalTest.cc
index 2799f5af361..1de780b710f 100644
--- a/MAC/APL/PAC/CalServer/test/CalTest.cc
+++ b/MAC/APL/PAC/CalServer/test/CalTest.cc
@@ -46,6 +46,7 @@ using namespace LOFAR;
 using namespace CAL;
 using namespace RTC;
 using namespace CAL_Protocol;
+using namespace GCF::TM;
 
 CalTest::CalTest(string name, string arrayname, string parentname, int nantennas, int nyquistzone, uint32 rcucontrol, int subarrayid)
   : GCFTask((State)&CalTest::initial, name), Test(name), m_handle(0), m_counter1(0),
@@ -272,7 +273,7 @@ GCFEvent::TResult CalTest::final(GCFEvent& e, GCFPortInterface& /*port*/)
   switch(e.signal)
   {
       case F_ENTRY:
-	  GCFTask::stop();
+	  GCFScheduler::instance()->stop();
 	  break;
       
       case F_EXIT:
@@ -289,12 +290,12 @@ GCFEvent::TResult CalTest::final(GCFEvent& e, GCFPortInterface& /*port*/)
 void CalTest::run()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
 int main(int argc, char** argv)
 {
-  GCFTask::init(argc, argv);
+  GCFScheduler::instance()->init(argc, argv);
 
   if (argc != 8) {
     cerr << "usage: CalTest arrayname parentname nantennas nyquistzone rcucontrol subarray=[0|1|2]" << endl;
diff --git a/MAC/APL/PAC/CalServer/test/CalTest.h b/MAC/APL/PAC/CalServer/test/CalTest.h
index 0232d1516fc..e64214a0ef9 100644
--- a/MAC/APL/PAC/CalServer/test/CalTest.h
+++ b/MAC/APL/PAC/CalServer/test/CalTest.h
@@ -29,10 +29,11 @@
 #include <GCF/TM/GCF_Control.h>
 #include <Common/LofarTypes.h>
 
-namespace LOFAR
-{
-  namespace CAL
-    {
+namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFPort;
+  using GCF::TM::GCFPortInterface;
+  namespace CAL {
 
       class CalTest : public GCFTask, public Test
 	{
diff --git a/MAC/APL/PIC/RSPDriver/src/Command.h b/MAC/APL/PIC/RSPDriver/src/Command.h
index e0e270c0f0e..b4ba4df5ada 100644
--- a/MAC/APL/PIC/RSPDriver/src/Command.h
+++ b/MAC/APL/PIC/RSPDriver/src/Command.h
@@ -33,6 +33,7 @@
 #include <GCF/TM/GCF_Control.h>
 
 namespace LOFAR {
+  using GCF::TM::GCFPortInterface;
   namespace RSP {
 
 class Command : public RefCount
diff --git a/MAC/APL/PIC/RSPDriver/src/RSPDriver.cc b/MAC/APL/PIC/RSPDriver/src/RSPDriver.cc
index 8506944eed4..6781f00b084 100644
--- a/MAC/APL/PIC/RSPDriver/src/RSPDriver.cc
+++ b/MAC/APL/PIC/RSPDriver/src/RSPDriver.cc
@@ -150,6 +150,7 @@
 #define PPS_FETCH_TIMEOUT { 3, 0 }
 
 namespace LOFAR {
+  using namespace GCF::TM;
   namespace RSP {
 	using namespace blitz;
 	using namespace std;
@@ -734,10 +735,12 @@ int RSPDriver::fetchPPS()
 //
 GCFEvent::TResult RSPDriver::initial(GCFEvent& event, GCFPortInterface& port)
 {
+	LOG_DEBUG_STR("RSPDriver::initial(" << eventName(event) << "@" << port.getName());
+
 	GCFEvent::TResult status = GCFEvent::HANDLED;
 
 	switch(event.signal) {
-	case F_INIT: {
+	case F_ENTRY: {
 		if (GET_CONFIG("RSPDriver.SYNC_MODE", i) == SYNC_PPS) {
 #ifdef HAVE_SYS_TIMEPPS_H
 			pps_params_t parm;
@@ -787,10 +790,10 @@ GCFEvent::TResult RSPDriver::initial(GCFEvent& event, GCFPortInterface& port)
 			exit(EXIT_FAILURE);
 #endif
 		} // sync mode
-	} // F_INIT
+	} // F_ENTRY
 	break;
 
-	case F_ENTRY: {
+	case F_INIT: {
 #if 0
 	if (GET_CONFIG("RSPDriver.SYNC_MODE", i) == SYNC_PARALLEL) {
 		if (!m_clock.isConnected()) m_clock.open();
@@ -2621,7 +2624,8 @@ using namespace LOFAR::RSP;
 
 int main(int argc, char** argv)
 {
-	GCFTask::init(argc, argv, "RSPDriver");    // initializes log system
+	GCFScheduler::instance()->init(argc, argv, "RSPDriver");    // initializes log system
+	GCFScheduler::instance()->disableQueue();					// run as fast as possible
 
 	// Inform Logprocessor who we are
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_RSPDriver");
@@ -2688,7 +2692,7 @@ int main(int argc, char** argv)
 	rsp.start(); // make initial transition
 
 	try {
-		GCFTask::run();
+		GCFScheduler::instance()->run();
 	}
 	catch (Exception& e) {
 		LOG_ERROR_STR("Exception: " << e.text());
diff --git a/MAC/APL/PIC/RSPDriver/src/RSPDriver.h b/MAC/APL/PIC/RSPDriver/src/RSPDriver.h
index 979f42190d9..ca5ad537c44 100644
--- a/MAC/APL/PIC/RSPDriver/src/RSPDriver.h
+++ b/MAC/APL/PIC/RSPDriver/src/RSPDriver.h
@@ -41,6 +41,9 @@
 #endif
 
 namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFTCPPort;
+  using GCF::TM::GCFETHRawPort;
   namespace RSP {
 
     class RSPDriver : public GCFTask
diff --git a/MAC/APL/PIC/RSPDriver/src/RawEvent.cc b/MAC/APL/PIC/RSPDriver/src/RawEvent.cc
index 7a1e7843bc8..13d00fc3124 100644
--- a/MAC/APL/PIC/RSPDriver/src/RawEvent.cc
+++ b/MAC/APL/PIC/RSPDriver/src/RawEvent.cc
@@ -33,6 +33,7 @@
 #include "RawEvent.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace EPA_Protocol;
 
 /**
@@ -830,7 +831,7 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port)
 		//
 		// dispatch the MEP message as a GCFEvent (which it now is)
 		//
-		status = task.dispatch(buf.event, port);
+		status = task.doEvent(buf.event, port);
 	}
 	else {
 		LOG_WARN("F_DATAIN: Discarding unknown message.");
diff --git a/MAC/APL/PIC/RSPDriver/src/Scheduler.cc b/MAC/APL/PIC/RSPDriver/src/Scheduler.cc
index 5058fcfa83a..b370876e39b 100644
--- a/MAC/APL/PIC/RSPDriver/src/Scheduler.cc
+++ b/MAC/APL/PIC/RSPDriver/src/Scheduler.cc
@@ -27,10 +27,11 @@
 #include "Scheduler.h"
 #include "SyncAction.h"
 
-using namespace LOFAR;
-using namespace RSP;
-using namespace RSP_Protocol;
-using namespace RTC;
+namespace LOFAR  {
+	using namespace GCF::TM;
+	using namespace RSP_Protocol;
+	using namespace RTC;
+	namespace RSP {
 
 #define SCHEDULING_DELAY 2
 
@@ -135,7 +136,7 @@ GCFEvent::TResult Scheduler::dispatch(GCFEvent& event, GCFPortInterface& port)
 		if (!(*sa)->hasCompleted()) {
 			// stil busy
 			sync_completed = false;
-			status = (*sa)->dispatch(*current_event, (*sa)->getBoardPort());
+			status = (*sa)->doEvent(*current_event, (*sa)->getBoardPort());
 
 			// When the SyncAction finished its work it set the completed-flag and went to the idle state.
 			// If the Syncaction was not finished is has sent a new msg to the board and we can wait for
@@ -435,7 +436,7 @@ void Scheduler::initiateSync(GCFEvent& event)
 		// dispatch F_TIMER event to first syncactions for each board
 		if (!(*port).second.empty()) {
 			for (unsigned int i = 0; i < (*port).second.size(); i++) {
-				(*port).second[i]->dispatch(event, (*port).second[i]->getBoardPort());
+				(*port).second[i]->doEvent(event, (*port).second[i]->getBoardPort());
 				if (!(*port).second[i]->doContinue()) {	// !doContinue() == msg was send, waiting for answer
 					break;
 				}
@@ -529,3 +530,5 @@ void Scheduler::completeCommands()
 	}
 }
 
+  } // namespace RSP
+} // namespace LOFAR
diff --git a/MAC/APL/PIC/RSPDriver/src/Sequencer.cc b/MAC/APL/PIC/RSPDriver/src/Sequencer.cc
index 614e78078b4..1c3c705d909 100644
--- a/MAC/APL/PIC/RSPDriver/src/Sequencer.cc
+++ b/MAC/APL/PIC/RSPDriver/src/Sequencer.cc
@@ -30,11 +30,12 @@
 #include "Cache.h"
 #include "StationSettings.h"
 
-using namespace LOFAR;
-using namespace RSP;
-using namespace EPA_Protocol;
-using namespace RTC;
 using namespace blitz;
+namespace LOFAR {
+	using namespace GCF::TM;
+	using namespace EPA_Protocol;
+	using namespace RTC;
+	namespace RSP {
 
 #define TDREAD_TIMEOUT 3
 #define RSUCLEAR_WAIT  5
@@ -65,7 +66,7 @@ Sequencer::~Sequencer()
 
 void Sequencer::run(GCFEvent& event, GCFPortInterface& port)
 {
-  this->dispatch(event, port);
+  this->doEvent(event, port);
 }
 
 bool Sequencer::isActive() const
@@ -583,3 +584,7 @@ GCFEvent::TResult Sequencer::cdoenable_state(GCFEvent& event, GCFPortInterface&
 
   return GCFEvent::HANDLED;
 }
+
+  } // namespace RSP
+} // namespace LOFAR
+
diff --git a/MAC/APL/PIC/RSPDriver/src/Sequencer.h b/MAC/APL/PIC/RSPDriver/src/Sequencer.h
index 35e3d596356..10577ba25a1 100644
--- a/MAC/APL/PIC/RSPDriver/src/Sequencer.h
+++ b/MAC/APL/PIC/RSPDriver/src/Sequencer.h
@@ -29,6 +29,9 @@
 #include <GCF/TM/GCF_Control.h>
 
 namespace LOFAR {
+  using GCF::TM::GCFFsm;
+  using GCF::TM::GCFPortInterface;
+  using GCF::TM::GCFTimerPort;
   namespace RSP {
 
     class Sequencer : public GCFFsm
diff --git a/MAC/APL/PIC/RSPDriver/src/SyncAction.cc b/MAC/APL/PIC/RSPDriver/src/SyncAction.cc
index 230b03f942a..de51f2a56bb 100644
--- a/MAC/APL/PIC/RSPDriver/src/SyncAction.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SyncAction.cc
@@ -27,9 +27,10 @@
 #include "SyncAction.h"
 #include "Sequencer.h"
 
-using namespace LOFAR;
-using namespace RSP;
-using namespace EPA_Protocol;
+namespace LOFAR {
+  using namespace GCF::TM;
+  using namespace EPA_Protocol;
+  namespace RSP {
 
 #define N_RETRIES 10
 
@@ -238,3 +239,5 @@ void SyncAction::reset()
   TRAN(SyncAction::idle_state);
 }
 
+  } // namespace RSP
+} // namespace LOFAR
diff --git a/MAC/APL/PIC/RSPDriver/src/SyncAction.h b/MAC/APL/PIC/RSPDriver/src/SyncAction.h
index 0deb2d394f2..66033b5ef58 100644
--- a/MAC/APL/PIC/RSPDriver/src/SyncAction.h
+++ b/MAC/APL/PIC/RSPDriver/src/SyncAction.h
@@ -28,6 +28,8 @@
 #include <GCF/TM/GCF_Control.h>
 
 namespace LOFAR {
+  using GCF::TM::GCFFsm;
+  using GCF::TM::GCFPortInterface;
   namespace RSP {
 
     class SyncAction : public GCFFsm
diff --git a/MAC/APL/PIC/RSPDriver/src/rspctl.cc b/MAC/APL/PIC/RSPDriver/src/rspctl.cc
index 8a0437aada8..d02cb567e08 100644
--- a/MAC/APL/PIC/RSPDriver/src/rspctl.cc
+++ b/MAC/APL/PIC/RSPDriver/src/rspctl.cc
@@ -28,6 +28,7 @@
 #include <Common/hexdump.h>
 
 #include <MACIO/MACServiceInfo.h>
+#include <GCF/TM/GCF_Scheduler.h>
 
 #include <APL/RSP_Protocol/RSP_Protocol.ph>
 #include <APL/RSP_Protocol/EPA_Protocol.ph>
@@ -58,6 +59,7 @@
                 c-'A'+10 : ((c>='a' && c<='f') ? c-'a'+10 : 0)))
 
 namespace LOFAR {
+  using namespace GCF::TM;
   namespace rspctl {
 	using namespace std;
 	using namespace blitz;
@@ -229,7 +231,7 @@ GCFEvent::TResult WeightsCommand::ack(GCFEvent& e)
 			
       if (RSP_SUCCESS != ack.status) {
 				logMessage(cerr,"Error: RSP_GETWEIGHTS command failed.");
-				GCFTask::stop();
+				GCFScheduler::instance()->stop();
 				return status;
       }
 			
@@ -261,7 +263,7 @@ GCFEvent::TResult WeightsCommand::ack(GCFEvent& e)
 					}
 	      }
 	     
-	      GCFTask::stop();
+	      GCFScheduler::instance()->stop();
       	return status;
 	    } else {	
       	itsStage = 1;
@@ -276,13 +278,13 @@ GCFEvent::TResult WeightsCommand::ack(GCFEvent& e)
       if (RSP_SUCCESS != ack.status) {
         logMessage(cerr,"Error: RSP_SETWEIGHTS command failed.");
       }
-      GCFTask::stop();
+      GCFScheduler::instance()->stop();
       return status;
     } break;
 
     default:
       status = GCFEvent::NOT_HANDLED;
-      GCFTask::stop();
+      GCFScheduler::instance()->stop();
       return status;
       break;
   }
@@ -413,7 +415,7 @@ GCFEvent::TResult SubbandsCommand::ack(GCFEvent& e)
       break;
   }
 
-  GCFTask::stop();
+  GCFScheduler::instance()->stop();
 
   return status;
 }
@@ -488,7 +490,7 @@ GCFEvent::TResult RCUCommand::ack(GCFEvent& e)
 	break;
   } // switch
 
-  GCFTask::stop();
+  GCFScheduler::instance()->stop();
 
   return GCFEvent::HANDLED;
 }
@@ -620,7 +622,7 @@ GCFEvent::TResult HBACommand::ack(GCFEvent& e)
 	break;
 	}
 
-	GCFTask::stop();
+	GCFScheduler::instance()->stop();
 
 	return (GCFEvent::HANDLED);
 }
@@ -688,7 +690,7 @@ GCFEvent::TResult RSUCommand::ack(GCFEvent& e)
     }
   }
 
-  GCFTask::stop();
+  GCFScheduler::instance()->stop();
 
   return GCFEvent::HANDLED;
 }
@@ -748,7 +750,7 @@ GCFEvent::TResult ClockCommand::ack(GCFEvent& e)
     }
   }
 
-  GCFTask::stop();
+  GCFScheduler::instance()->stop();
 
   return GCFEvent::HANDLED;
 }
@@ -789,7 +791,7 @@ GCFEvent::TResult SubClockCommand::ack(GCFEvent& e)
 	if (g_getclock) {
 
 	  logMessage(cout,formatString("Sample frequency: clock=%dMHz", ack.clock));
-	  GCFTask::stop();
+	  GCFScheduler::instance()->stop();
 
 	} else {
 
@@ -906,7 +908,7 @@ GCFEvent::TResult TDStatusCommand::ack(GCFEvent& event)
 		}
 	}
 
-	GCFTask::stop();
+	GCFScheduler::instance()->stop();
 	return GCFEvent::HANDLED;
 }
 
@@ -1026,7 +1028,7 @@ GCFEvent::TResult TBBCommand::ack(GCFEvent& e)
 		break;
 	}
 
-	GCFTask::stop();
+	GCFScheduler::instance()->stop();
 
 	return status;
 }
@@ -1138,7 +1140,7 @@ GCFEvent::TResult SICommand::ack(GCFEvent& e)
 		break;
 	}
 
-	GCFTask::stop();
+	GCFScheduler::instance()->stop();
 
 	return status;
 }
@@ -1263,7 +1265,7 @@ GCFEvent::TResult SPUStatusCommand::ack(GCFEvent& event)
 		}
 	}
 
-	GCFTask::stop();
+	GCFScheduler::instance()->stop();
 	return (GCFEvent::HANDLED);
 }
 //
@@ -1340,7 +1342,7 @@ GCFEvent::TResult RawBlockCommand::ack(GCFEvent&	event)
 		cerr << "Unknown answer return while reading or writing a datablock" << endl;
 	}
 
-	GCFTask::stop();
+	GCFScheduler::instance()->stop();
 	return (GCFEvent::HANDLED);
 }
 
@@ -1447,7 +1449,7 @@ GCFEvent::TResult SplitterCommand::ack(GCFEvent& event)
 		break;
 	}
 
-	GCFTask::stop();
+	GCFScheduler::instance()->stop();
 	return (GCFEvent::HANDLED);
 }
 
@@ -1558,7 +1560,7 @@ GCFEvent::TResult WGCommand::ack(GCFEvent& e)
   }
   LOG_INFO("WGCommand success");
 
-  GCFTask::stop();
+  GCFScheduler::instance()->stop();
 
   return status;
 }
@@ -1723,7 +1725,7 @@ GCFEvent::TResult StatusCommand::ack(GCFEvent& event)
     break;
   }
 
-  GCFTask::stop();
+  GCFScheduler::instance()->stop();
   return GCFEvent::HANDLED;
 }
 
@@ -1769,7 +1771,7 @@ void StatisticsCommand::send()
   else {
     // SET
     logMessage(cerr,"Error: set mode not support for option '--statistics'");
-    GCFTask::stop();
+    GCFScheduler::instance()->stop();
   }
 }
 
@@ -1822,7 +1824,7 @@ void StatisticsCommand::capture_statistics(Array<double, 2>& stats, const Timest
       if(timeNow >= m_endTime) {
         logMessage(cout,"Statistics capturing successfully ended.");
         stop();
-        GCFTask::stop();
+        GCFScheduler::instance()->stop();
       }
     }
     
@@ -1998,7 +2000,7 @@ void XCStatisticsCommand::send()
   else {
     // SET
     logMessage(cerr,"Error: set mode not support for option '--xcstatistics'");
-    GCFTask::stop();
+    GCFScheduler::instance()->stop();
   }
 }
 
@@ -2051,7 +2053,7 @@ void XCStatisticsCommand::capture_xcstatistics(Array<complex<double>, 4>& stats,
 			if(timeNow >= m_endTime) {
 				logMessage(cout,"XCStatistics capturing successfully ended.");
 				stop();
-				GCFTask::stop();
+				GCFScheduler::instance()->stop();
 			}
 		}
 
@@ -2209,7 +2211,7 @@ GCFEvent::TResult VersionCommand::ack(GCFEvent& e)
   else {
     logMessage(cerr,"Error: RSP_GETVERSION command failed.");
   }
-  GCFTask::stop();
+  GCFScheduler::instance()->stop();
 
   return GCFEvent::HANDLED;
 }
@@ -2267,11 +2269,9 @@ GCFEvent::TResult RSPCtl::initial(GCFEvent& e, GCFPortInterface& port)
     break;
 
     case F_ENTRY: {
-      if (!m_server.isConnected())
-        if (!m_server.open()) {
-	  logMessage(cerr, "Error: failed to open port to RSPDriver");
-	  exit(EXIT_FAILURE);
-	}
+      if (!m_server.isConnected()) {
+        m_server.open();
+	  }
     }
     break;
 
@@ -2416,13 +2416,13 @@ GCFEvent::TResult RSPCtl::docommand(GCFEvent& e, GCFPortInterface& port)
 	case RSPFE_STOP_RSPCTL:
 		logMessage(cout,"Rspctl stopped by frontend.");
 		m_command->stop();
-		GCFTask::stop();
+		GCFScheduler::instance()->stop();
 	break;
 #endif
 
 	default:
 		logMessage(cerr,"Error: unhandled event.");
-		GCFTask::stop();
+		GCFScheduler::instance()->stop();
 		break;
 	}
 
@@ -2432,7 +2432,7 @@ GCFEvent::TResult RSPCtl::docommand(GCFEvent& e, GCFPortInterface& port)
 void RSPCtl::mainloop()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
 static void usage(bool exportMode)
@@ -3441,7 +3441,7 @@ using namespace LOFAR::rspctl;
 
 int main(int argc, char** argv)
 {
-	GCFTask::init(argc, argv, "rspctl");
+	GCFScheduler::instance()->init(argc, argv, "rspctl");
 
 	LOG_INFO(formatString("Program %s has started", argv[0]));
 
diff --git a/MAC/APL/PIC/RSPDriver/src/rspctl.h b/MAC/APL/PIC/RSPDriver/src/rspctl.h
index 27b84cfa055..0730acc19ee 100644
--- a/MAC/APL/PIC/RSPDriver/src/rspctl.h
+++ b/MAC/APL/PIC/RSPDriver/src/rspctl.h
@@ -36,7 +36,6 @@
 #include "RSPFE_Protocol.ph"
 #endif
 #include <GCF/TM/GCF_Control.h>
-#include <GCF/TM/GCF_ETHRawPort.h>
 
 #include <APL/RTCCommon/Timestamp.h>
 
@@ -44,6 +43,10 @@
 #include <blitz/array.h>
 
 namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFPort;
+  using GCF::TM::GCFTCPPort;
+  using GCF::TM::GCFPortInterface;
   namespace rspctl {
 		
 //
diff --git a/MAC/APL/PIC/RSPDriver/test/EPAStub.cc b/MAC/APL/PIC/RSPDriver/test/EPAStub.cc
index 5d6144dd3e7..819c9e56841 100644
--- a/MAC/APL/PIC/RSPDriver/test/EPAStub.cc
+++ b/MAC/APL/PIC/RSPDriver/test/EPAStub.cc
@@ -23,16 +23,17 @@
 
 #include <lofar_config.h>
 #include <Common/LofarLogger.h>
+#include <Common/ParameterSet.h>
+
+#include <GCF/TM/GCF_Scheduler.h>
 
 #include <APL/RSP_Protocol/EPA_Protocol.ph>
-#include "RawEvent.h"
+#include <APL/RSP_Protocol/BeamletWeights.h>
+#include <APL/RTCCommon/PSAccess.h>
 
+#include "RawEvent.h"
 #include "EPAStub.h"
 
-#include <APL/RSP_Protocol/BeamletWeights.h>
-
-#include <APL/RTCCommon/PSAccess.h>
-#include <Common/ParameterSet.h>
 
 #include <iostream>
 #include <sys/time.h>
@@ -40,8 +41,9 @@
 #include <math.h>
 
 using namespace std;
-using namespace LOFAR;
-using namespace RSP_Test;
+namespace LOFAR {
+  using namespace GCF::TM;
+  namespace RSP_Test {
 
 #define ETHERTYPE_EPA 0x10FA
 
@@ -547,7 +549,7 @@ GCFEvent::TResult EPAStub::final(GCFEvent& event, GCFPortInterface& /*port*/)
   switch(event.signal)
   {
     case F_ENTRY:
-      GCFTask::stop();
+      GCFScheduler::instance()->stop();
       break;
 
     case F_EXIT:
@@ -618,12 +620,21 @@ GCFEvent::TResult EPAStub::read_stats(EPAReadEvent& event, GCFPortInterface& por
 void EPAStub::run()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
+
+  } // namespace RSP_Test
+} // namespace LOFAR
+
+
+using namespace LOFAR;
+using namespace RSP_Test;
+using namespace GCF::TM;
+
 int main(int argc, char** argv)
 {
-  GCFTask::init(argc, argv);
+  GCFScheduler::instance()->init(argc, argv);
 
   LOG_INFO(formatString("Program %s has started", argv[0]));
 
diff --git a/MAC/APL/PIC/RSPDriver/test/EPAStub.h b/MAC/APL/PIC/RSPDriver/test/EPAStub.h
index 1cbdf29f2cb..6d073769590 100644
--- a/MAC/APL/PIC/RSPDriver/test/EPAStub.h
+++ b/MAC/APL/PIC/RSPDriver/test/EPAStub.h
@@ -27,9 +27,12 @@
 
 #include <Suite/test.h>
 #include <GCF/TM/GCF_Control.h>
-#include <GCF/TM/GCF_ETHRawPort.h>
 
 namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFPortInterface;
+  using GCF::TM::GCFTimerPort;
+  using GCF::TM::GCFETHRawPort;
   namespace RSP_Test {
 
     class EPAStub : public GCFTask, public Test
diff --git a/MAC/APL/PIC/RSPDriver/test/RSPTest.cc b/MAC/APL/PIC/RSPDriver/test/RSPTest.cc
index 146f19831ca..9c9326e1448 100644
--- a/MAC/APL/PIC/RSPDriver/test/RSPTest.cc
+++ b/MAC/APL/PIC/RSPDriver/test/RSPTest.cc
@@ -41,6 +41,7 @@
 using namespace std;
 using namespace blitz;
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace RTC;
 using namespace EPA_Protocol;
 using namespace RSP_Protocol;
@@ -1172,7 +1173,7 @@ GCFEvent::TResult RSPTest::final(GCFEvent& e, GCFPortInterface& /*port*/)
   switch(e.signal)
   {
       case F_ENTRY:
-	  GCFTask::stop();
+	  GCFScheduler::instance()->stop();
 	  break;
       
       case F_EXIT:
@@ -1189,12 +1190,12 @@ GCFEvent::TResult RSPTest::final(GCFEvent& e, GCFPortInterface& /*port*/)
 void RSPTest::run()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
 int main(int argc, char** argv)
 {
-  GCFTask::init(argc, argv);
+  GCFScheduler::instance()->init(argc, argv);
 
   LOG_INFO(formatString("Program %s has started", argv[0]));
 
diff --git a/MAC/APL/PIC/RSPDriver/test/RSPTest.h b/MAC/APL/PIC/RSPDriver/test/RSPTest.h
index db8b78c47a8..cbe84ace157 100644
--- a/MAC/APL/PIC/RSPDriver/test/RSPTest.h
+++ b/MAC/APL/PIC/RSPDriver/test/RSPTest.h
@@ -33,6 +33,10 @@
 using LOFAR::MACIO::GCFEvent;
 
 namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFPort;
+  using GCF::TM::GCFPortInterface;
+  using GCF::TM::GCFTimerPort;
   namespace RSP_Test {
   class RSPTest : public GCFTask, public Test
   {
diff --git a/MAC/APL/PIC/SHMInfoServer/src/SHMInfoServerMain.cc b/MAC/APL/PIC/SHMInfoServer/src/SHMInfoServerMain.cc
index 81fbd8b9ad7..ef4d2b7ea5b 100644
--- a/MAC/APL/PIC/SHMInfoServer/src/SHMInfoServerMain.cc
+++ b/MAC/APL/PIC/SHMInfoServer/src/SHMInfoServerMain.cc
@@ -31,7 +31,7 @@ using namespace LOFAR::AMI;
 
 int main(int argc, char *argv[])
 {
-	GCFTask::init(argc, argv, "SHMInfoServer");
+	GCFScheduler::instance()->init(argc, argv, "SHMInfoServer");
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_SHMInfoServer");
 
 	SHMInfoServer 	sis;
@@ -39,7 +39,7 @@ int main(int argc, char *argv[])
 
 	//
 	try {
-	  GCFTask::run();
+	  GCFScheduler::instance()->run();
 	}
 	catch (std::exception& x) {
 	  LOG_INFO_STR("Unexpected exception: " << x.what());
diff --git a/MAC/APL/PIC/SHMInfoServer/src/SHMSession.cc b/MAC/APL/PIC/SHMInfoServer/src/SHMSession.cc
index 2bb3dadea36..b7226c1c76c 100644
--- a/MAC/APL/PIC/SHMInfoServer/src/SHMSession.cc
+++ b/MAC/APL/PIC/SHMInfoServer/src/SHMSession.cc
@@ -207,12 +207,14 @@ GCFEvent::TResult SHMSession::waiting_state(GCFEvent& e, GCFPortInterface& p)
     
     case SHM_RECONFIGURATION_REQUEST:
       TRAN(SHMSession::reconfigure_state);
-      dispatch(e, p);
+//      dispatch(e, p);
+	  GCFScheduler::instance()->queueEvent(this, e, &p);
       break;
     
     case SHM_LOFAR_STRUCTURE_REQUEST:
       TRAN(SHMSession::getPICStructure_state);
-      dispatch(e, p);
+//      dispatch(e, p);
+	  GCFScheduler::instance()->queueEvent(this, e, &p);
       break;
     
 //    case SHM_PVSS_DP_SUBSCRIPTION_REQUEST:
diff --git a/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc b/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc
index 023ce5c211a..b99751c4c53 100644
--- a/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc
@@ -28,6 +28,7 @@
 #include "AllocCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/ArpCmd.cc b/MAC/APL/PIC/TBBDriver/src/ArpCmd.cc
index 12efc1ff5e1..3a6bd90ea9e 100644
--- a/MAC/APL/PIC/TBBDriver/src/ArpCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ArpCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;	
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/ArpModeCmd.cc b/MAC/APL/PIC/TBBDriver/src/ArpModeCmd.cc
index 611ec2a8796..a131b8a5a69 100644
--- a/MAC/APL/PIC/TBBDriver/src/ArpModeCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ArpModeCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;	
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc
index 7987d1c1059..0ca9f5e63c0 100644
--- a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc
+++ b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc
@@ -33,6 +33,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using	namespace TBB;
 
diff --git a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h
index 6b9f2556369..ec1cb124f90 100644
--- a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h
+++ b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h
@@ -45,6 +45,9 @@
 #include "DriverSettings.h"
 
 namespace LOFAR {
+	using GCF::TM::GCFFsm;
+	using GCF::TM::GCFPortInterface;
+	using GCF::TM::GCFTimerPort;
 	namespace TBB {
 	
 		class BoardCmdHandler : public GCFFsm
diff --git a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc
index 32a3367c889..66de7cb44d8 100644
--- a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc
@@ -28,6 +28,7 @@
 #include "ClearCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc
index a99fc4a48b4..babc8f7c5fa 100644
--- a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
index cea2958643f..3885328d064 100644
--- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
+++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
@@ -31,6 +31,7 @@
 
 
 namespace LOFAR {
+  using GCF::TM::GCFPortInterface;
   namespace TBB {
 
 static const int DRIVER_VERSION = 206; // 2.06 
diff --git a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc
index d7a8667147a..37798c4d569 100644
--- a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc b/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc
index 8671c53f26a..b5a8d0b7a86 100644
--- a/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc
@@ -27,6 +27,7 @@
 #include "FreeCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc
index cd1c194f257..379b79672bc 100644
--- a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc
@@ -26,6 +26,7 @@
 #include "ImageInfoCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc
index b412c003049..7f11111f9d0 100644
--- a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc
@@ -27,6 +27,7 @@
 #include "PageperiodCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc
index 8b605426341..1b60c61c450 100644
--- a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc
+++ b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc
@@ -226,7 +226,7 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port)
 		//
 		// dispatch the TP message as a GCFEvent (which it now is)
 		//
-		status = task.dispatch(buf.event, port);
+		status = task.doEvent(buf.event, port);
 	}
 	else
 	{
diff --git a/MAC/APL/PIC/TBBDriver/src/RawEvent.h b/MAC/APL/PIC/TBBDriver/src/RawEvent.h
index 130a99ceaf4..720ddbaf8a6 100644
--- a/MAC/APL/PIC/TBBDriver/src/RawEvent.h
+++ b/MAC/APL/PIC/TBBDriver/src/RawEvent.h
@@ -28,6 +28,8 @@
 #include <GCF/TM/GCF_Control.h>
 
 namespace LOFAR {
+	using GCF::TM::GCFTask;
+	using GCF::TM::GCFPortInterface;
 	namespace TBB {
 		
 		class RawEvent
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc
index f1fb2b950ba..d5c6a903998 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc
index 8136892aa8f..2d2a014bedb 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc
@@ -27,6 +27,7 @@
 #include "ReadfCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadrCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadrCmd.cc
index 097e4bfef05..e8882551f2d 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadrCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ReadrCmd.cc
@@ -27,6 +27,7 @@
 #include "ReadrCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc
index 318818ce4f6..897c59a7041 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc
@@ -27,6 +27,7 @@
 #include "ReadwCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadxCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadxCmd.cc
index e2e74da2ef9..9280872849c 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadxCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ReadxCmd.cc
@@ -27,6 +27,7 @@
 #include "ReadxCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc b/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc
index 86c12088e67..a0f99bd896c 100644
--- a/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc
@@ -27,6 +27,7 @@
 #include "RecordCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc
index 7c1cdc9549c..cb930f5a9c6 100644
--- a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc
@@ -28,6 +28,7 @@
 #include "ResetCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc b/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc
index 914fb4ff2e0..3b2e8c11c07 100644
--- a/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc
@@ -27,6 +27,7 @@
 #include "SizeCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc b/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc
index 13ae1b4c93c..6675b425a80 100644
--- a/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc
@@ -26,6 +26,7 @@
 #include "StatusCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/StopCepCmd.cc b/MAC/APL/PIC/TBBDriver/src/StopCepCmd.cc
index 644d29054af..c8d79f7d569 100644
--- a/MAC/APL/PIC/TBBDriver/src/StopCepCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/StopCepCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;	
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/StopCmd.cc b/MAC/APL/PIC/TBBDriver/src/StopCmd.cc
index 44e4b8f1daa..49ebe046422 100644
--- a/MAC/APL/PIC/TBBDriver/src/StopCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/StopCmd.cc
@@ -27,6 +27,7 @@
 #include "StopCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
index 2c55ba03996..b0395ca0e19 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
@@ -74,6 +74,7 @@
 #define ETHERTYPE_TP 0x7BB0     // letters of TBB
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB;
 
 static bool   itsDaemonize  = false;
@@ -590,7 +591,7 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 				LOG_DEBUG_STR("queue:" << eventName(*e));
 				
 				if (SetTbbCommand(e->signal)) {
-					status = cmdhandler->dispatch(*e,*itsTbbQueue->front()->port);
+					status = cmdhandler->doEvent(*e,*itsTbbQueue->front()->port);
 					// delete e;
 
 					TbbEvent* tmp = itsTbbQueue->front();
@@ -709,7 +710,7 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 					itsAliveTimer->cancelAllTimers();
 					itsAliveTimer->setTimer(ALIVECHECKTIME);
 					itsAliveCheck = false;
-					status = cmdhandler->dispatch(event,port);
+					status = cmdhandler->doEvent(event,port);
 					TRAN(TBBDriver::busy_state);
 				} else {
 					TBBDriverBusyAckEvent ack;    
@@ -788,7 +789,7 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 					itsAliveTimer->setTimer(ALIVECHECKTIME);
 				}
 			} else {
-				status = cmdhandler->dispatch(event,port); // dispatch time-out event 
+				status = cmdhandler->doEvent(event,port); // dispatch time-out event 
 			}
 		} break;
 		
@@ -865,7 +866,7 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 		case TP_WATCHDOG_ACK:
 		case TP_TEMP_LIMIT_ACK: 
 		{
-			status = cmdhandler->dispatch(event,port); // dispatch ack from boards  
+			status = cmdhandler->doEvent(event,port); // dispatch ack from boards  
 			if (cmdhandler->tpCmdDone()) {
 				TRAN(TBBDriver::idle_state);
 			}
@@ -1358,7 +1359,7 @@ bool TBBDriver::SetTbbCommand(unsigned short signal)
 //
 int main(int argc, char** argv)
 {
-	LOFAR::GCF::TM::GCFTask::init(argc, argv, "TBBDriver");    // initializes log system
+	LOFAR::GCF::TM::GCFScheduler::instance()->init(argc, argv, "TBBDriver");    // initializes log system
 	
 	// Inform Logprocessor who we are
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_TBBDriver");
@@ -1394,7 +1395,7 @@ int main(int argc, char** argv)
 	tbb.start(); // make initialsition
 	
 	try {
-		LOFAR::GCF::TM::GCFTask::run();
+		LOFAR::GCF::TM::GCFScheduler::instance()->run();
 	}
 	catch (LOFAR::Exception& e) {
 		LOG_ERROR_STR("Exception: " << e.text());
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
index ede0d95ba69..604ef44007e 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
@@ -40,6 +40,11 @@
 //# Never #include <config.h> or #include <lofar_config.h> in a header file!
 
 namespace LOFAR{
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFTCPPort;
+  using GCF::TM::GCFETHRawPort;
+  using GCF::TM::GCFPortInterface;
+  using GCF::TM::GCFTimerPort;
   namespace TBB{
 
     // Description of class.
diff --git a/MAC/APL/PIC/TBBDriver/src/TempLimitCmd.cc b/MAC/APL/PIC/TBBDriver/src/TempLimitCmd.cc
index 607033bce7e..85c55980c85 100644
--- a/MAC/APL/PIC/TBBDriver/src/TempLimitCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TempLimitCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;	
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/TrigCoefCmd.cc b/MAC/APL/PIC/TBBDriver/src/TrigCoefCmd.cc
index a8a3457b83c..f5b3a00e5b9 100644
--- a/MAC/APL/PIC/TBBDriver/src/TrigCoefCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TrigCoefCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/TrigGenCmd.cc b/MAC/APL/PIC/TBBDriver/src/TrigGenCmd.cc
index da0599c9e45..3494b901558 100644
--- a/MAC/APL/PIC/TBBDriver/src/TrigGenCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TrigGenCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/TrigInfoCmd.cc b/MAC/APL/PIC/TBBDriver/src/TrigInfoCmd.cc
index dd90291dbee..eb7f952da04 100644
--- a/MAC/APL/PIC/TBBDriver/src/TrigInfoCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TrigInfoCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/TrigReleaseCmd.cc b/MAC/APL/PIC/TBBDriver/src/TrigReleaseCmd.cc
index e7dc415b3c0..da9bbe9c01e 100644
--- a/MAC/APL/PIC/TBBDriver/src/TrigReleaseCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TrigReleaseCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc b/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc
index f479fc66030..6e81aca9d2a 100644
--- a/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/TrigclrCmd.cc b/MAC/APL/PIC/TBBDriver/src/TrigclrCmd.cc
index e1de9037421..601dc93750b 100644
--- a/MAC/APL/PIC/TBBDriver/src/TrigclrCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TrigclrCmd.cc
@@ -27,6 +27,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc
index 540a8b5eb45..0225c6946de 100644
--- a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc
@@ -29,6 +29,7 @@
 #include "UdpCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc b/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc
index 42ea530000a..431d6a90614 100644
--- a/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc
@@ -28,6 +28,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;	
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/WatchDogCmd.cc b/MAC/APL/PIC/TBBDriver/src/WatchDogCmd.cc
index f62fa5ec435..0fdb5fc2c0f 100644
--- a/MAC/APL/PIC/TBBDriver/src/WatchDogCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/WatchDogCmd.cc
@@ -28,6 +28,7 @@
 #include "WatchDogCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc
index d6f512d4d44..d7afc5d8ec8 100644
--- a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc
@@ -29,6 +29,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/WriterCmd.cc b/MAC/APL/PIC/TBBDriver/src/WriterCmd.cc
index c7905a5cf1b..bc5fa1010f9 100644
--- a/MAC/APL/PIC/TBBDriver/src/WriterCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/WriterCmd.cc
@@ -27,6 +27,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc b/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc
index 3532b478114..cf23c07d63a 100644
--- a/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc
@@ -27,6 +27,7 @@
 #include "WritewCmd.h"
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using	namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/XXXCmd.cc b/MAC/APL/PIC/TBBDriver/src/XXXCmd.cc
index ed3bb055ad0..06ab3c8ed34 100644
--- a/MAC/APL/PIC/TBBDriver/src/XXXCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/XXXCmd.cc
@@ -27,6 +27,7 @@
 
 
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TP_Protocol;	
 using namespace TBB;
diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
index 0e8bc8f9e05..a9a7a9483be 100644
--- a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
+++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
@@ -53,6 +53,7 @@
 using namespace std;
 //using namespace blitz;
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TBB_Protocol;
 using namespace TbbCtl;
 
@@ -2509,7 +2510,7 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port)
 
 		case TBB_DRIVER_BUSY_ACK: {
 		cout << endl << "=x=x=   DRIVER BUSY, with setting up boards, try again   =x=x=" << endl << flush;
-		GCFTask::stop();    
+		GCFScheduler::instance()->stop();    
 	 }
 
 	 case TBB_GET_CONFIG_ACK: {
@@ -2519,7 +2520,7 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port)
 		itsMaxChannels = itsMaxBoards * 16;
 		if (itsActiveBoards == 0) {
 		  cout << "=x=x=   NO boards available   =x=x=" << endl << flush;
-		  GCFTask::stop();    
+		  GCFScheduler::instance()->stop();    
 		}      
 			
 		// send subscribe 
@@ -2592,7 +2593,7 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port)
 				cout << endl;
 				TBBUnsubscribeEvent unsubscribe;
 				itsServerPort.send(unsubscribe);
-				GCFTask::stop();
+				GCFScheduler::instance()->stop();
 			}
 		} break;
 	
@@ -2601,7 +2602,7 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port)
 	
 		case TBB_DRIVER_BUSY_ACK: {
 			cout << "DRIVER BUSY, try again" << endl << flush;
-			GCFTask::stop();    
+			GCFScheduler::instance()->stop();    
 		}
 			
 		case TBB_ALLOC_ACK:
@@ -2652,7 +2653,7 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port)
 			cout << formatString("Error: unhandled event. %d",e.signal) << endl;
 			//TBBUnsubscribeEvent unsubscribe;
 			//itsServerPort.send(unsubscribe);
-			GCFTask::stop();
+			GCFScheduler::instance()->stop();
 		} break;
 	}
 	
@@ -2660,7 +2661,7 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port)
 		//TBBUnsubscribeEvent unsubscribe;
 		//itsServerPort.send(unsubscribe);
 		cout << flush;
-		GCFTask::stop();
+		GCFScheduler::instance()->stop();
 	}
 		 
 	return(status);
@@ -3290,7 +3291,7 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 					uint32 word[8];
 					
 					int numitems = sscanf(optarg, "%d,%d,%x,%x,%x,%x,%x,%x,%x,%x,%x", &board,&mp,&addr,
-										 &word[0],&word[1],&word[2],&word[3],&word[4],&word[5],&word[6],&word[7]);
+										 &word[1],&word[2],&word[3],&word[4],&word[5],&word[6],&word[7]);
 					if (numitems < 5 || numitems == EOF || board < 0 || board >= itsMaxBoards || mp > 3) {
 						cout << "Error: invalid write ddr value. Should be of the format " << endl;
 						cout <<  "       '--writew=board, mp, addr, word[0], word[1] .. word[7]'"<< endl; 
@@ -3510,7 +3511,7 @@ std::list<int> TBBCtl::strtolist(const char* str, int max)
 void TBBCtl::mainloop()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 	
 	TBBUnsubscribeEvent unsubscribe;
 	itsServerPort.send(unsubscribe);
@@ -3519,7 +3520,7 @@ void TBBCtl::mainloop()
 //-----------------------------------------------------------------------------
 int main(int argc, char** argv)
 {
-  GCFTask::init(argc, argv, "tbbctl");
+  GCFScheduler::instance()->init(argc, argv, "tbbctl");
   
   LOG_DEBUG(formatString("Program %s has started", argv[0]));
 
diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.h b/MAC/APL/PIC/TBBDriver/src/tbbctl.h
index 19de286e9f7..50b2072c423 100644
--- a/MAC/APL/PIC/TBBDriver/src/tbbctl.h
+++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.h
@@ -36,6 +36,10 @@
 
 
 namespace LOFAR {
+  using GCF::TM::GCFTask;
+  using GCF::TM::GCFPort;
+  using GCF::TM::GCFTimerPort;
+  using GCF::TM::GCFPortInterface;
   namespace TbbCtl {
   	
 // MAX_N_TBBOARDS and MAX_N_RCUS come from TBB_protocol.ph
diff --git a/MAC/APL/PIC/TBBDriver/test/StubRawEvent.cc b/MAC/APL/PIC/TBBDriver/test/StubRawEvent.cc
index 885bf9a4c97..a590589da0f 100644
--- a/MAC/APL/PIC/TBBDriver/test/StubRawEvent.cc
+++ b/MAC/APL/PIC/TBBDriver/test/StubRawEvent.cc
@@ -189,7 +189,7 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port)
 		//
 		// dispatch the TP message as a GCFEvent (which it now is)
 		//
-		status = task.dispatch(buf.event, port);
+		status = task.doEvent(buf.event, port);
 	}
   else
 	{
diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTest.cc b/MAC/APL/PIC/TBBDriver/test/TBBTest.cc
index 48566b6f5d6..3fffecc12cf 100644
--- a/MAC/APL/PIC/TBBDriver/test/TBBTest.cc
+++ b/MAC/APL/PIC/TBBDriver/test/TBBTest.cc
@@ -38,6 +38,7 @@
 
 using namespace std;
 using namespace LOFAR;
+using namespace GCF::TM;
 //using namespace RTC;
 using namespace TBB_Protocol;
 using namespace TBB_Test;
@@ -660,7 +661,7 @@ GCFEvent::TResult TBBTest::final(GCFEvent& e, GCFPortInterface& /*port*/)
   switch(e.signal)
   {
       case F_ENTRY:
-	  GCFTask::stop();
+	  GCFScheduler::instance()->stop();
 	  break;
       
       case F_EXIT:
@@ -677,13 +678,13 @@ GCFEvent::TResult TBBTest::final(GCFEvent& e, GCFPortInterface& /*port*/)
 void TBBTest::run()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
 
 int main(int argc, char** argv)
 {
-  GCFTask::init(argc, argv);
+  GCFScheduler::instance()->init(argc, argv);
 
   LOG_INFO(formatString("Program %s has started", argv[0]));
 
diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTest.h b/MAC/APL/PIC/TBBDriver/test/TBBTest.h
index 8c4c8ad3dd1..f5ce1730499 100644
--- a/MAC/APL/PIC/TBBDriver/test/TBBTest.h
+++ b/MAC/APL/PIC/TBBDriver/test/TBBTest.h
@@ -30,6 +30,10 @@
 #include <GCF/TM/GCF_ETHRawPort.h>
 
 namespace LOFAR {
+	using GCF::TM::GCFTask;
+	using GCF::TM::GCFPort;
+	using GCF::TM::GCFETHRawPort;
+	using GCF::TM::GCFPortInterface;
 	namespace TBB_Test {
   
   class TBBTest : public GCFTask, public Test
diff --git a/MAC/APL/PIC/TBBDriver/test/TPStub.cc b/MAC/APL/PIC/TBBDriver/test/TPStub.cc
index 4c8ef90bd80..9055c3c00bc 100644
--- a/MAC/APL/PIC/TBBDriver/test/TPStub.cc
+++ b/MAC/APL/PIC/TBBDriver/test/TPStub.cc
@@ -38,6 +38,7 @@
 
 using namespace std;
 using namespace LOFAR;
+using namespace GCF::TM;
 using namespace TP_Protocol;
 using namespace TBB;
 using namespace TBB_Test;
@@ -318,7 +319,7 @@ GCFEvent::TResult TPStub::final(GCFEvent &event, GCFPortInterface& /*port*/)
   {
     case F_ENTRY:
 			{
-				GCFTask::stop();
+				GCFScheduler::instance()->stop();
     	} break;
 
     case F_EXIT:
@@ -335,12 +336,12 @@ GCFEvent::TResult TPStub::final(GCFEvent &event, GCFPortInterface& /*port*/)
 void TPStub::run()
 {
   start(); // make initial transition
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 }
 
 int main(int argc, char** argv)
 {
-  GCFTask::init(argc, argv);
+  GCFScheduler::instance()->init(argc, argv);
 	
 	LOG_DEBUG_STR("Reading configuration files");
   try {
diff --git a/MAC/APL/PIC/TBBDriver/test/TPStub.h b/MAC/APL/PIC/TBBDriver/test/TPStub.h
index 84bba37a894..feee1527484 100644
--- a/MAC/APL/PIC/TBBDriver/test/TPStub.h
+++ b/MAC/APL/PIC/TBBDriver/test/TPStub.h
@@ -32,6 +32,9 @@
 #include "TP_Protocol.ph"
 
 namespace LOFAR {
+	using GCF::TM::GCFTask;
+	using GCF::TM::GCFETHRawPort;
+	using GCF::TM::GCFPortInterface;
 	namespace TBB_Test {
 
     class TPStub : public GCFTask, public Test
diff --git a/MAC/APL/RTDBCommon/include/APL/RTDBCommon/ClaimMgrTask.h b/MAC/APL/RTDBCommon/include/APL/RTDBCommon/ClaimMgrTask.h
index 3fc8c378e85..63d518c2ee9 100644
--- a/MAC/APL/RTDBCommon/include/APL/RTDBCommon/ClaimMgrTask.h
+++ b/MAC/APL/RTDBCommon/include/APL/RTDBCommon/ClaimMgrTask.h
@@ -33,6 +33,7 @@
 namespace LOFAR {
   using GCF::TM::GCFTask;
   using GCF::TM::GCFTCPPort;
+  using GCF::TM::GCFTimerPort;
   using GCF::TM::GCFPortInterface;
   using GCF::TM::GCFHandler;
   using GCF::RTDB::RTDBPropertySet;
diff --git a/MAC/APL/RTDBCommon/test/tClaimManager.cc b/MAC/APL/RTDBCommon/test/tClaimManager.cc
index 6fd330d3525..b4dde90639d 100644
--- a/MAC/APL/RTDBCommon/test/tClaimManager.cc
+++ b/MAC/APL/RTDBCommon/test/tClaimManager.cc
@@ -89,7 +89,7 @@ GCFEvent::TResult MgrTest::doTest(GCFEvent& event, GCFPortInterface& port)
 	break;
 
 	case F_TIMER:
-		stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
@@ -111,12 +111,12 @@ using namespace LOFAR::APL::RTDBCommon;
 
 int main(int argc, char* argv[])
 {
-	TM::GCFTask::init(argc, argv);
+	TM::GCFScheduler::instance()->init(argc, argv);
 
 	MgrTest test_task("UtilTest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	TM::GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/RTDBCommon/test/tClaimManager.h b/MAC/APL/RTDBCommon/test/tClaimManager.h
index 7d011b55ddd..224a6bdc401 100644
--- a/MAC/APL/RTDBCommon/test/tClaimManager.h
+++ b/MAC/APL/RTDBCommon/test/tClaimManager.h
@@ -30,7 +30,7 @@ namespace LOFAR {
  namespace APL {
   namespace RTDBCommon {
 
-class MgrTest : public GCFTask
+class MgrTest : public GCF::TM::GCFTask
 {
 public:
 	MgrTest (const string& name);
@@ -39,9 +39,9 @@ public:
 	GCFEvent::TResult doTest	(GCFEvent& e, GCFPortInterface& p);
 
 private:
-	GCFTimerPort*		itsTimerPort;
-	GCFITCPort*			itsMsgPort;
-	ClaimMgrTask*		itsClaimMgrTask;
+	GCF::TM::GCFTimerPort*		itsTimerPort;
+	GCF::TM::GCFITCPort*		itsMsgPort;
+	ClaimMgrTask*				itsClaimMgrTask;
 };
 
   } // namespace RTDBCommon
diff --git a/MAC/APL/RTDBCommon/test/tRTDButilities.cc b/MAC/APL/RTDBCommon/test/tRTDButilities.cc
index b0f26fdffc6..c99ef65742b 100644
--- a/MAC/APL/RTDBCommon/test/tRTDButilities.cc
+++ b/MAC/APL/RTDBCommon/test/tRTDButilities.cc
@@ -88,7 +88,7 @@ GCFEvent::TResult tRTDButil::doTest(GCFEvent& e, GCFPortInterface& /*p*/)
 			itsTimerPort->setTimer(3.0);
 		}
 		else {
-			stop();
+			GCFScheduler::instance()->stop();
 		}
 	break;
 
@@ -111,12 +111,12 @@ using namespace LOFAR::APL::RTDBCommon;
 
 int main(int argc, char* argv[])
 {
-	TM::GCFTask::init(argc, argv);
+	TM::GCFScheduler::instance()->init(argc, argv);
 
 	tRTDButil test_task("UtilTest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	TM::GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/RTDBCommon/test/tRTDButilities.h b/MAC/APL/RTDBCommon/test/tRTDButilities.h
index 86fb34ff856..e25d16b34db 100644
--- a/MAC/APL/RTDBCommon/test/tRTDButilities.h
+++ b/MAC/APL/RTDBCommon/test/tRTDButilities.h
@@ -30,16 +30,16 @@ namespace LOFAR {
  namespace APL {
   namespace RTDBCommon {
 
-class tRTDButil : public GCFTask
+class tRTDButil : public GCF::TM::GCFTask
 {
 public:
 	tRTDButil (const string& name);
 	virtual ~tRTDButil();
 
-	GCFEvent::TResult doTest	(GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult doTest	(GCFEvent& e, GCF::TM::GCFPortInterface& p);
 
 private:
-	GCFTimerPort*		itsTimerPort;
+	GCF::TM::GCFTimerPort*		itsTimerPort;
 };
 
   } // namespace RTDBCommon
diff --git a/MAC/APL/StationCU/include/APL/ClockProtocol/Makefile.am b/MAC/APL/StationCU/include/APL/ClockProtocol/Makefile.am
new file mode 100644
index 00000000000..8534475bf7b
--- /dev/null
+++ b/MAC/APL/StationCU/include/APL/ClockProtocol/Makefile.am
@@ -0,0 +1,3 @@
+
+include $(top_srcdir)/Makefile.common
+
diff --git a/MAC/APL/StationCU/include/APL/ClockProtocol/Package__Version.h b/MAC/APL/StationCU/include/APL/ClockProtocol/Package__Version.h
new file mode 100644
index 00000000000..88fd33c8a19
--- /dev/null
+++ b/MAC/APL/StationCU/include/APL/ClockProtocol/Package__Version.h
@@ -0,0 +1,40 @@
+//# Get revision info; generated by autoconf_share/makeversion
+
+#ifndef LOFAR_STATIONCU_PACKAGE__VERSION_H
+#define LOFAR_STATIONCU_PACKAGE__VERSION_H
+
+#include <Common/Version.h>
+
+// Class to get the version (revision) of the package and the packages it uses.
+namespace LOFAR {
+  class StationCUVersion
+  {
+  public:
+    // Get the info for this package.
+    static Version getInfo();
+
+    // Get the version number of the package (as given in repository).
+    static std::string getVersion();
+    // Get the svn version number of the package according to configure.in.
+    static std::string getConfVersion();
+    // Get the global revision number of the package.
+    static std::string getRevision();
+    // Get the local revision number of the package.
+    static std::string getPackageRevision();
+    // Get the number of files differing from repository.
+    // Usually this is blank, but it can tell the nr of changed files.
+    static std::string getNrChangedFiles();
+    // Get the date/time the package was built (in fact, configured).
+    static std::string getBuildTime();
+    // Get the name of the user who built the package.
+    static std::string getBuildUser();
+    // Get the machine the package was built on.
+    static std::string getBuildMachine();
+
+    // Append the vector with the vinfo of this package and used packages.
+    static void fillInfo (int level,
+			  std::vector<Version::PkgInfo>& vec);
+  };
+}
+
+#endif
diff --git a/MAC/APL/StationCU/include/Makefile.am b/MAC/APL/StationCU/include/Makefile.am
new file mode 100644
index 00000000000..0a329cd8b8e
--- /dev/null
+++ b/MAC/APL/StationCU/include/Makefile.am
@@ -0,0 +1,5 @@
+
+SUBDIRS = APL/ClockProtocol
+
+include $(top_srcdir)/Makefile.common
+
diff --git a/MAC/APL/StationCU/src/BeamControl/BeamControl.cc b/MAC/APL/StationCU/src/BeamControl/BeamControl.cc
index be29f7e81df..c0eaf4bef89 100644
--- a/MAC/APL/StationCU/src/BeamControl/BeamControl.cc
+++ b/MAC/APL/StationCU/src/BeamControl/BeamControl.cc
@@ -590,7 +590,7 @@ GCFEvent::TResult BeamControl::quiting_state(GCFEvent& event, GCFPortInterface&
 	}
 	
 	case F_TIMER:
-		GCFTask::stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
diff --git a/MAC/APL/StationCU/src/BeamControl/BeamControlMain.cc b/MAC/APL/StationCU/src/BeamControl/BeamControlMain.cc
index a482022d713..e309ff0d9ac 100644
--- a/MAC/APL/StationCU/src/BeamControl/BeamControlMain.cc
+++ b/MAC/APL/StationCU/src/BeamControl/BeamControlMain.cc
@@ -31,7 +31,7 @@ using namespace LOFAR::StationCU;
 int main(int argc, char* argv[])
 {
 	// args: cntlrname, parentHost, parentService
-	GCFTask::init(argc, argv, argv[1]);
+	GCFScheduler::instance()->init(argc, argv, argv[1]);
 
 	ParentControl*	pc = ParentControl::instance();
 	pc->start();	// make initial transition
@@ -39,7 +39,7 @@ int main(int argc, char* argv[])
 	BeamControl	bc(argv[1]);
 	bc.start(); 	// make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/StationCU/src/CalibrationControl/CalibrationControl.cc b/MAC/APL/StationCU/src/CalibrationControl/CalibrationControl.cc
index 5dd936aff5a..e6b938e6943 100644
--- a/MAC/APL/StationCU/src/CalibrationControl/CalibrationControl.cc
+++ b/MAC/APL/StationCU/src/CalibrationControl/CalibrationControl.cc
@@ -600,7 +600,7 @@ GCFEvent::TResult CalibrationControl::quiting_state(GCFEvent& 		  event,
 	break;
 
 	case F_TIMER:
-		GCFTask::stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
diff --git a/MAC/APL/StationCU/src/CalibrationControl/CalibrationControlMain.cc b/MAC/APL/StationCU/src/CalibrationControl/CalibrationControlMain.cc
index b0c58e856d0..d78ef29546a 100644
--- a/MAC/APL/StationCU/src/CalibrationControl/CalibrationControlMain.cc
+++ b/MAC/APL/StationCU/src/CalibrationControl/CalibrationControlMain.cc
@@ -31,7 +31,7 @@ using namespace LOFAR::StationCU;
 int main(int argc, char* argv[])
 {
 	// args: cntlrname, parentHost, parentService
-	GCFTask::init(argc, argv, argv[1]);
+	GCFScheduler::instance()->init(argc, argv, argv[1]);
 
 	ParentControl*	pc = ParentControl::instance();
 	pc->start();	// make initial transition
@@ -39,7 +39,7 @@ int main(int argc, char* argv[])
 	CalibrationControl	cc(argv[1]);
 	cc.start(); 	// make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/StationCU/src/ClockControl/ClockControl.cc b/MAC/APL/StationCU/src/ClockControl/ClockControl.cc
index f8127c57c26..c0195d98e52 100644
--- a/MAC/APL/StationCU/src/ClockControl/ClockControl.cc
+++ b/MAC/APL/StationCU/src/ClockControl/ClockControl.cc
@@ -781,7 +781,7 @@ GCFEvent::TResult ClockControl::finishing_state(GCFEvent& event, GCFPortInterfac
 	}
   
     case F_TIMER:
-      GCFTask::stop();
+      GCFScheduler::instance()->stop();
       break;
     
 	default:
diff --git a/MAC/APL/StationCU/src/ClockControl/ClockControlMain.cc b/MAC/APL/StationCU/src/ClockControl/ClockControlMain.cc
index d79de31cd11..d7b8a5b121f 100644
--- a/MAC/APL/StationCU/src/ClockControl/ClockControlMain.cc
+++ b/MAC/APL/StationCU/src/ClockControl/ClockControlMain.cc
@@ -35,7 +35,7 @@ int main(int argc, char* argv[])
 	}
 
 	// args: cntlrname, parentHost, parentService
-	GCFTask::init(argc, argv, "ClockControl");
+	GCFScheduler::instance()->init(argc, argv, "ClockControl");
 
 	ParentControl*	pc = ParentControl::instance();
 	pc->start();	// make initial transition
@@ -43,7 +43,7 @@ int main(int argc, char* argv[])
 	ClockControl	cc(argv[1]);
 	cc.start(); 	// make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/StationCU/src/HardwareMonitor/ECMonitor.cc b/MAC/APL/StationCU/src/HardwareMonitor/ECMonitor.cc
index a20be2acafe..ddc3214b69f 100644
--- a/MAC/APL/StationCU/src/HardwareMonitor/ECMonitor.cc
+++ b/MAC/APL/StationCU/src/HardwareMonitor/ECMonitor.cc
@@ -685,7 +685,7 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port)
   hexdump(hd,&buf,sizeof(buf));
   LOG_DEBUG_STR("raw buf all=" << hd);
   // dispatch the EC message as a GCFEvent (which it now is)
-  status = task.dispatch(buf.event, port);
+  status = task.doEvent(buf.event, port);
   
   return(status);
 }
diff --git a/MAC/APL/StationCU/src/HardwareMonitor/HardwareMonitorMain.cc b/MAC/APL/StationCU/src/HardwareMonitor/HardwareMonitorMain.cc
index 627f8fbe7ef..d15b46744d9 100644
--- a/MAC/APL/StationCU/src/HardwareMonitor/HardwareMonitorMain.cc
+++ b/MAC/APL/StationCU/src/HardwareMonitor/HardwareMonitorMain.cc
@@ -40,7 +40,7 @@ using namespace LOFAR::StationCU;
 int main(int argc, char* argv[])
 {
 	// args: cntlrname, parentHost, parentService
-	GCFTask::init(argc, argv, "HardwareMonitor");
+	GCFScheduler::instance()->init(argc, argv, "HardwareMonitor");
 
 	LOG_INFO("MACProcessScope: LOFAR_PermSW_HardwareMonitor");
 	LOG_INFO(Version::getInfo<StationCUVersion>("HardwareMonitor"));
@@ -84,8 +84,8 @@ int main(int argc, char* argv[])
 	}
 
 	// ok, we have something to do, do it.
-	GCFTask::setDelayedQuit(true);	// we need a clean shutdown
-	GCFTask::run();	// until stop was called
+	GCFScheduler::instance()->setDelayedQuit(true);	// we need a clean shutdown
+	GCFScheduler::instance()->run();	// until stop was called
 
 	if (rsp) {
 		rsp->quit();		// let task quit nicely
@@ -97,7 +97,7 @@ int main(int argc, char* argv[])
 		ec->quit();		   // let task quit nicely
 	}
 	double	postRunTime = globalParameterSet()->getDouble("closingDelay", 1.5);
-	GCFTask::run(postRunTime);	// let processes die.
+	GCFScheduler::instance()->run(postRunTime);	// let processes die.
 
 	return (0);
 }
diff --git a/MAC/APL/StationCU/src/StationControl/ActiveObs.cc b/MAC/APL/StationCU/src/StationControl/ActiveObs.cc
index 6211db3abef..2d3d28f2c99 100644
--- a/MAC/APL/StationCU/src/StationControl/ActiveObs.cc
+++ b/MAC/APL/StationCU/src/StationControl/ActiveObs.cc
@@ -229,7 +229,7 @@ GCFEvent::TResult	ActiveObs::starting(GCFEvent&	event, GCFPortInterface&	port)
 		CONTROLQuitedEvent		msg(event);
 		LOG_FATAL_STR("Controller " << msg.cntlrName << " died unexpectedly. Aborting observation");
 		TRAN(ActiveObs::stopping);
-		dispatch(event, port);
+		doEvent(event, port);
 	}
 	break;
 
@@ -320,7 +320,7 @@ GCFEvent::TResult	ActiveObs::connected(GCFEvent&	event, GCFPortInterface&	port)
 		CONTROLQuitedEvent		msg(event);
 		LOG_FATAL_STR("Controller " << msg.cntlrName << " died unexpectedly. Aborting observation");
 		TRAN(ActiveObs::stopping);
-		dispatch(event, port);
+		doEvent(event, port);
 	}
 	break;
 
@@ -414,7 +414,7 @@ GCFEvent::TResult	ActiveObs::standby(GCFEvent&	event, GCFPortInterface&	port)
 		CONTROLQuitedEvent		msg(event);
 		LOG_FATAL_STR("Controller " << msg.cntlrName << " died unexpectedly. Aborting observation");
 		TRAN(ActiveObs::stopping);
-		dispatch(event, port);
+		doEvent(event, port);
 	}
 	break;
 
@@ -553,7 +553,7 @@ GCFEvent::TResult	ActiveObs::operational(GCFEvent&	event, GCFPortInterface&	port
 		CONTROLQuitedEvent		msg(event);
 		LOG_FATAL_STR("Controller " << msg.cntlrName << " died unexpectedly. Aborting observation");
 		TRAN(ActiveObs::stopping);
-		dispatch(event, port);
+		doEvent(event, port);
 	}
 	break;
 
diff --git a/MAC/APL/StationCU/src/StationControl/StationControl.cc b/MAC/APL/StationCU/src/StationControl/StationControl.cc
index dcd37e270e6..e1762727342 100644
--- a/MAC/APL/StationCU/src/StationControl/StationControl.cc
+++ b/MAC/APL/StationCU/src/StationControl/StationControl.cc
@@ -486,12 +486,12 @@ GCFEvent::TResult StationControl::operational_state(GCFEvent& event, GCFPortInte
 						" should have died by now, sending an extra QUIT command.");
 			CONTROLQuitEvent	quitevent;
 			quitevent.cntlrName = theObs->second->getName();
-			theObs->second->dispatch(quitevent, port);
+			theObs->second->doEvent(quitevent, port);
 		}
 
 		// pass event to observation FSM
 		LOG_TRACE_FLOW("Dispatch to observation FSM's");
-		theObs->second->dispatch(event, port);
+		theObs->second->doEvent(event, port);
 		LOG_TRACE_FLOW("Back from dispatch");
 	}
 	break;
@@ -581,7 +581,7 @@ LOG_DEBUG_STR("inSync = " << (theObs->second->inSync() ? "true" : "false"));
 #endif
 		// pass event to observation FSM
 		LOG_TRACE_FLOW("Dispatch to observation FSM's");
-		theObs->second->dispatch(event, port);
+		theObs->second->doEvent(event, port);
 
 		// end of FSM?
 		if (event.signal == CONTROL_QUITED && theObs->second->isReady()) {
@@ -666,7 +666,7 @@ GCFEvent::TResult StationControl::finishing_state(GCFEvent& event, GCFPortInterf
 	}
   
     case F_TIMER:
-      GCFTask::stop();
+      GCFScheduler::instance()->stop();
       break;
     
 	default:
diff --git a/MAC/APL/StationCU/src/StationControl/StationControlMain.cc b/MAC/APL/StationCU/src/StationControl/StationControlMain.cc
index e05e6bed3af..85173ae7f2a 100644
--- a/MAC/APL/StationCU/src/StationControl/StationControlMain.cc
+++ b/MAC/APL/StationCU/src/StationControl/StationControlMain.cc
@@ -36,7 +36,7 @@ using namespace LOFAR::StationCU;
 int main(int argc, char* argv[])
 {
 	// args: cntlrname, parentHost, parentService
-	GCFTask::init(argc, argv, basename(argv[0]));
+	GCFScheduler::instance()->init(argc, argv, basename(argv[0]));
 
 	ParentControl*	pc = ParentControl::instance();
 	pc->start();	// make initial transition
@@ -54,7 +54,7 @@ int main(int argc, char* argv[])
 	StationControl	sc(myName.c_str());
 	sc.start(); 	// make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/StationCU/src/TBBControl/TBBControl.cc b/MAC/APL/StationCU/src/TBBControl/TBBControl.cc
index c338608ec9f..4719807a5bb 100644
--- a/MAC/APL/StationCU/src/TBBControl/TBBControl.cc
+++ b/MAC/APL/StationCU/src/TBBControl/TBBControl.cc
@@ -1288,7 +1288,7 @@ GCFEvent::TResult TBBControl::quiting_state(GCFEvent& event, GCFPortInterface& p
 		} break;
 		
 		case F_TIMER: {
-			GCFTask::stop();
+			GCFScheduler::instance()->stop();
 		} break;
 	
 		default: {
diff --git a/MAC/APL/StationCU/src/TBBControl/TBBControlMain.cc b/MAC/APL/StationCU/src/TBBControl/TBBControlMain.cc
index b4192ad46da..21080f5dd95 100644
--- a/MAC/APL/StationCU/src/TBBControl/TBBControlMain.cc
+++ b/MAC/APL/StationCU/src/TBBControl/TBBControlMain.cc
@@ -32,7 +32,7 @@ using namespace LOFAR::StationCU;
 int main(int argc, char* argv[])
 {
 	// args: cntlrname, parentHost, parentService
-	GCFTask::init(argc, argv, argv[0]);
+	GCFScheduler::instance()->init(argc, argv, argv[0]);
 
 	ParentControl*	pc = ParentControl::instance();
 	pc->start();	// make initial transition
@@ -43,7 +43,7 @@ int main(int argc, char* argv[])
 	VHECRTask*		vt(VHECRTask::instance());
 	//vt->start();
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/TestCtlr/src/ControllerMenu.cc b/MAC/APL/TestCtlr/src/ControllerMenu.cc
index 2e7723098f4..c6c71bc4792 100644
--- a/MAC/APL/TestCtlr/src/ControllerMenu.cc
+++ b/MAC/APL/TestCtlr/src/ControllerMenu.cc
@@ -146,7 +146,7 @@ GCFEvent::TResult ControllerMenu::startup_state(GCFEvent& event, GCFPortInterfac
 											 itsInstanceNr,
 											 myHostname(false))) {
 				cout << "Error during start of controller, bailing out" << endl;
-				stop();
+				GCFScheduler::instance()->stop();
 			}
 			cout << endl << "Startrequest queued, waiting for confirmation...";
 		}
@@ -165,7 +165,7 @@ GCFEvent::TResult ControllerMenu::startup_state(GCFEvent& event, GCFPortInterfac
 			}
 			else {
 				cout << endl << "StartDaemon could not start the controller, bailing out." << endl;
-				stop();
+				GCFScheduler::instance()->stop();
 			}
 		}
 		break;
@@ -175,7 +175,7 @@ GCFEvent::TResult ControllerMenu::startup_state(GCFEvent& event, GCFPortInterfac
 			cout << endl << "Connection result = " << msg.result << endl;
 			if (msg.result != CT_RESULT_NO_ERROR) {
 				cout << "Bailing out because of the errors." << endl;
-				stop ();
+				GCFScheduler::instance()->stop ();
 			}
 			else {
 				_doActionMenu();	// does a TRAN
@@ -210,7 +210,7 @@ GCFEvent::TResult ControllerMenu::claim_state(GCFEvent& event, GCFPortInterface&
 			string		cntlrName = controllerName(itsCntlrType, itsInstanceNr, itsObsNr);
 			if (!itsChildControl->requestState(CTState::CLAIMED, cntlrName, itsObsNr, itsCntlrType)) {
 				cout << "Error during state request, bailing out" << endl;
-				stop();
+				GCFScheduler::instance()->stop();
 			}
 		}
    		break;
@@ -225,7 +225,7 @@ GCFEvent::TResult ControllerMenu::claim_state(GCFEvent& event, GCFPortInterface&
 			cout << endl << "Claim result = " << msg.result << endl;
 			if (msg.result != CT_RESULT_NO_ERROR) {
 				cout << "Bailing out because of the errors." << endl;
-				stop ();
+				GCFScheduler::instance()->stop ();
 			}
 			else {
 				_doActionMenu();
@@ -261,7 +261,7 @@ GCFEvent::TResult ControllerMenu::prepare_state(GCFEvent& event, GCFPortInterfac
 			string		cntlrName = controllerName(itsCntlrType, itsInstanceNr, itsObsNr);
 			if (!itsChildControl->requestState(CTState::PREPARED, cntlrName, itsObsNr, itsCntlrType)) {
 				cout << "Error during state request, bailing out" << endl;
-				stop();
+				GCFScheduler::instance()->stop();
 			}
 		}
    		break;
@@ -276,7 +276,7 @@ GCFEvent::TResult ControllerMenu::prepare_state(GCFEvent& event, GCFPortInterfac
 			cout << endl << "Prepare result = " << msg.result << endl;
 			if (msg.result != CT_RESULT_NO_ERROR) {
 				cout << "Bailing out because of the errors." << endl;
-				stop ();
+				GCFScheduler::instance()->stop ();
 			}
 			else {
 				_doActionMenu();
@@ -311,7 +311,7 @@ GCFEvent::TResult ControllerMenu::run_state(GCFEvent& event, GCFPortInterface& /
 			string		cntlrName = controllerName(itsCntlrType, itsInstanceNr, itsObsNr);
 			if (!itsChildControl->requestState(CTState::RESUMED, cntlrName, itsObsNr, itsCntlrType)) {
 				cout << "Error during state request, bailing out" << endl;
-				stop();
+				GCFScheduler::instance()->stop();
 			}
 		}
    		break;
@@ -326,7 +326,7 @@ GCFEvent::TResult ControllerMenu::run_state(GCFEvent& event, GCFPortInterface& /
 			cout << endl << "Resume result = " << msg.result << endl;
 			if (msg.result != CT_RESULT_NO_ERROR) {
 				cout << "Bailing out because of the errors." << endl;
-				stop ();
+				GCFScheduler::instance()->stop ();
 			}
 			else {
 				_doActionMenu();
@@ -361,7 +361,7 @@ GCFEvent::TResult ControllerMenu::suspend_state(GCFEvent& event, GCFPortInterfac
 			string		cntlrName = controllerName(itsCntlrType, itsInstanceNr, itsObsNr);
 			if (!itsChildControl->requestState(CTState::SUSPENDED, cntlrName, itsObsNr, itsCntlrType)) {
 				cout << "Error during state request, bailing out" << endl;
-				stop();
+				GCFScheduler::instance()->stop();
 			}
 		}
    		break;
@@ -376,7 +376,7 @@ GCFEvent::TResult ControllerMenu::suspend_state(GCFEvent& event, GCFPortInterfac
 			cout << endl << "Suspend result = " << msg.result << endl;
 			if (msg.result != CT_RESULT_NO_ERROR) {
 				cout << "Bailing out because of the errors." << endl;
-				stop ();
+				GCFScheduler::instance()->stop ();
 			}
 			else {
 				_doActionMenu();
@@ -411,7 +411,7 @@ GCFEvent::TResult ControllerMenu::release_state(GCFEvent& event, GCFPortInterfac
 			string		cntlrName = controllerName(itsCntlrType, itsInstanceNr, itsObsNr);
 			if (!itsChildControl->requestState(CTState::RELEASED, cntlrName, itsObsNr, itsCntlrType)) {
 				cout << "Error during state request, bailing out" << endl;
-				stop();
+				GCFScheduler::instance()->stop();
 			}
 		}
    		break;
@@ -426,7 +426,7 @@ GCFEvent::TResult ControllerMenu::release_state(GCFEvent& event, GCFPortInterfac
 			cout << endl << "Release result = " << msg.result << endl;
 			if (msg.result != CT_RESULT_NO_ERROR) {
 				cout << "Bailing out because of the errors." << endl;
-				stop ();
+				GCFScheduler::instance()->stop ();
 			}
 			else {
 				_doActionMenu();
@@ -461,7 +461,7 @@ GCFEvent::TResult ControllerMenu::finish_state(GCFEvent& event, GCFPortInterface
 			string		cntlrName = controllerName(itsCntlrType, itsInstanceNr, itsObsNr);
 			if (!itsChildControl->requestState(CTState::QUITED, cntlrName, itsObsNr, itsCntlrType)) {
 				cout << "Error during state request, bailing out" << endl;
-				stop();
+				GCFScheduler::instance()->stop();
 			}
 		}
    		break;
@@ -527,7 +527,7 @@ int16 ControllerMenu::_chooseController()
 	}
 
 	if (CntlrType == 0) {
-		stop();
+		GCFScheduler::instance()->stop();
 	}
 	
 	return (CntlrType + 1);
@@ -551,7 +551,7 @@ void ControllerMenu::_doStartMenu()
 		cin.clear();
 		cin >> obsnr;
 		if (obsnr == 0) {
-			stop();
+			GCFScheduler::instance()->stop();
 			return;
 		}
 		ifstream	iFile;
@@ -618,7 +618,7 @@ void ControllerMenu::_doActionMenu()
 			return;
 			break;
 		case 'q':
-			stop();
+			GCFScheduler::instance()->stop();
 			break;
 		default:
 			command = "";
diff --git a/MAC/APL/TestCtlr/src/ControllerMenuMain.cc b/MAC/APL/TestCtlr/src/ControllerMenuMain.cc
index ead16f3258c..c0f9b369f36 100644
--- a/MAC/APL/TestCtlr/src/ControllerMenuMain.cc
+++ b/MAC/APL/TestCtlr/src/ControllerMenuMain.cc
@@ -30,7 +30,7 @@ using namespace LOFAR::Test;
 
 int main(int argc, char* argv[])
 {
-	GCFTask::init(argc, argv, "ControllerMenu");
+	GCFScheduler::instance()->init(argc, argv, "ControllerMenu");
 
 	ChildControl*	cc = ChildControl::instance();
 	cc->start();	// make initial transition
@@ -38,7 +38,7 @@ int main(int argc, char* argv[])
 	ControllerMenu	tc(argc == 2 ? atoi(argv[1]) : 0);
 	tc.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/APL/TestCtlr/src/TestControllerMain.cc b/MAC/APL/TestCtlr/src/TestControllerMain.cc
index 80983fa8f8d..fe7bc45c6c4 100644
--- a/MAC/APL/TestCtlr/src/TestControllerMain.cc
+++ b/MAC/APL/TestCtlr/src/TestControllerMain.cc
@@ -30,7 +30,7 @@ using namespace LOFAR::Test;
 
 int main(int argc, char* argv[])
 {
-	GCFTask::init(argc, argv);
+	GCFScheduler::instance()->init(argc, argv);
 
 	ParentControl*	pc = ParentControl::instance();
 	pc->start();	// make initial transition
@@ -38,7 +38,7 @@ int main(int argc, char* argv[])
 	TestController	tc(argv[1]);
 	tc.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/Deployment/data/PVSS/Adder.dpdef b/MAC/Deployment/data/PVSS/Adder.dpdef
index cee95b62c76..77cd612ea68 100644
--- a/MAC/Deployment/data/PVSS/Adder.dpdef
+++ b/MAC/Deployment/data/PVSS/Adder.dpdef
@@ -1,4 +1,3 @@
 # Adder
-dropping		bool
+dropping			bool
 nrBlocksDropped		int
-
diff --git a/MAC/GCF/PVSS/src/GSA_SCADAHandler.cc b/MAC/GCF/PVSS/src/GSA_SCADAHandler.cc
index 5d91d59af89..556c9c6703b 100644
--- a/MAC/GCF/PVSS/src/GSA_SCADAHandler.cc
+++ b/MAC/GCF/PVSS/src/GSA_SCADAHandler.cc
@@ -26,7 +26,7 @@
 
 #include "GSA_SCADAHandler.h"
 #include <GSA_Resources.h>
-#include <GCF/TM/GCF_Task.h>
+#include <GCF/TM/GCF_Scheduler.h>
 //#include <Common/ParameterSet.h>
 
 namespace LOFAR {
@@ -38,8 +38,8 @@ GSASCADAHandler* GSASCADAHandler::instance()
 {
   if (0 == _pInstance) {
     string cmdline;
-    for (int i = 0; i < GCFTask::_argc; i++) {
-      cmdline += GCFTask::_argv[i];
+    for (int i = 0; i < TM::GCFScheduler::_argc; i++) {
+      cmdline += TM::GCFScheduler::_argv[i];
       cmdline += " ";
     }
     cmdline += "-currentproj ";
@@ -47,9 +47,9 @@ GSASCADAHandler* GSASCADAHandler::instance()
 //#define PARAM_PVSS_CMDLINE "mac.%s.pvss.cmdline"
 //#define PARAM_DEFAULT_PVSS_CMDLINE "mac.controller.pvss.cmdline"
 //    string pvssCmdLineParam = PARAM_DEFAULT_PVSS_CMDLINE;
-//    char* appName = strrchr(GCFTask::_argv[0], '/');
+//    char* appName = strrchr(GCFScheduler::_argv[0], '/');
 //    if (!globalParameterSet()->isDefined(pvssCmdLineParam)) {            
-//      pvssCmdLineParam = formatString(PARAM_PVSS_CMDLINE, (appName ? appName + 1 : GCFTask::_argv[0]));
+//      pvssCmdLineParam = formatString(PARAM_PVSS_CMDLINE, (appName ? appName + 1 : GCFScheduler::_argv[0]));
 //    }
 //    if (globalParameterSet()->isDefined(pvssCmdLineParam)) {
 //      cmdline += globalParameterSet()->getString(pvssCmdLineParam);
diff --git a/MAC/GCF/PVSS/src/GSA_SCADAHandler.h b/MAC/GCF/PVSS/src/GSA_SCADAHandler.h
index b87b19bda91..2c11b0bd719 100644
--- a/MAC/GCF/PVSS/src/GSA_SCADAHandler.h
+++ b/MAC/GCF/PVSS/src/GSA_SCADAHandler.h
@@ -37,7 +37,7 @@ namespace LOFAR {
  * uses the PVSS API. It calls the dispatch of the PVSS API to handle incoming 
  * and outgoing messages from/to PVSS.
  */
-class GSASCADAHandler : GCFHandler
+class GSASCADAHandler : TM::GCFHandler
 {
 public:
     static GSASCADAHandler* instance ();
diff --git a/MAC/GCF/PVSS/test/tMonitorState.cc b/MAC/GCF/PVSS/test/tMonitorState.cc
index 162368af5e8..265299b5074 100644
--- a/MAC/GCF/PVSS/test/tMonitorState.cc
+++ b/MAC/GCF/PVSS/test/tMonitorState.cc
@@ -112,7 +112,7 @@ GCFEvent::TResult tMonitorState::final(GCFEvent& e, GCFPortInterface& /*p*/)
 
 	switch (e.signal) {
 	case F_ENTRY:
-		stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
@@ -160,12 +160,12 @@ using namespace LOFAR::GCF;
 
 int main(int argc, char* argv[])
 {
-	TM::GCFTask::init(argc, argv);
+	TM::GCFScheduler::instance()->init(argc, argv);
 
 	PVSS::tMonitorState test_task("QueryTest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	TM::GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/GCF/PVSS/test/tMonitorState.h b/MAC/GCF/PVSS/test/tMonitorState.h
index d096242ae4b..d58b05d23a2 100644
--- a/MAC/GCF/PVSS/test/tMonitorState.h
+++ b/MAC/GCF/PVSS/test/tMonitorState.h
@@ -30,6 +30,8 @@
 
 namespace LOFAR {
  namespace GCF {
+  using TM::GCFTask;
+  using TM::GCFTimerPort;
   namespace PVSS {
 /**
  * The tMonitorState task receives ECHO_PING events from the Ping task and
diff --git a/MAC/GCF/PVSS/test/tPVSSservice.cc b/MAC/GCF/PVSS/test/tPVSSservice.cc
index 6bde4722759..7664937eaff 100644
--- a/MAC/GCF/PVSS/test/tPVSSservice.cc
+++ b/MAC/GCF/PVSS/test/tPVSSservice.cc
@@ -136,7 +136,7 @@ GCFEvent::TResult tGSAService::final(GCFEvent& e, GCFPortInterface& /*p*/)
 		break;
 	
 	case F_TIMER:
-		stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
@@ -751,12 +751,12 @@ using namespace LOFAR::GCF;
 
 int main(int argc, char* argv[])
 {
-	TM::GCFTask::init(argc, argv);
+	TM::GCFScheduler::instance()->init(argc, argv);
 
 	PVSS::tGSAService test_task("SALtest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	TM::GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/GCF/PVSS/test/tPVSSservice.h b/MAC/GCF/PVSS/test/tPVSSservice.h
index e840fb43720..707af001125 100644
--- a/MAC/GCF/PVSS/test/tPVSSservice.h
+++ b/MAC/GCF/PVSS/test/tPVSSservice.h
@@ -30,6 +30,8 @@
 
 namespace LOFAR {
  namespace GCF {
+  using TM::GCFTask;
+  using TM::GCFPortInterface;
   namespace PVSS {
 /**
  * The tGSAService task receives ECHO_PING events from the Ping task and
@@ -74,9 +76,9 @@ class tGSAService : public GCFTask
    * task are received on the server port. And reply events to the Ping task
    * are sent through the server port.
    */
-	PVSSservice* 	itsService;;
-	PVSSresponse*	itsResponse;
-	GCFTimerPort*	itsTimerPort;
+	PVSSservice* 		itsService;;
+	PVSSresponse*		itsResponse;
+	TM::GCFTimerPort*	itsTimerPort;
 };
 
   } // namespace PVSS
diff --git a/MAC/GCF/PVSS/test/tPerformance.cc b/MAC/GCF/PVSS/test/tPerformance.cc
index 3336fb1980b..b9b30550da7 100644
--- a/MAC/GCF/PVSS/test/tPerformance.cc
+++ b/MAC/GCF/PVSS/test/tPerformance.cc
@@ -111,7 +111,7 @@ GCFEvent::TResult tPerformance::final(GCFEvent& e, GCFPortInterface& /*p*/)
 		break;
 	
 	case F_TIMER:
-		stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
@@ -396,12 +396,12 @@ int main(int argc, char* argv[])
 		NR_OF_DPS = 10;
 	}
 
-	TM::GCFTask::init(argc, argv);
+	GCFScheduler::instance()->init(argc, argv);
 
 	PVSS::tPerformance test_task("SALSpeedTest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/GCF/PVSS/test/tPerformance.h b/MAC/GCF/PVSS/test/tPerformance.h
index 378351b6538..84d34bcc5dd 100644
--- a/MAC/GCF/PVSS/test/tPerformance.h
+++ b/MAC/GCF/PVSS/test/tPerformance.h
@@ -31,6 +31,9 @@
 
 namespace LOFAR {
  namespace GCF {
+  using TM::GCFTask;
+  using TM::GCFPortInterface;
+  using TM::GCFTimerPort;
   namespace PVSS {
 /**
  * The tPerformance task receives ECHO_PING events from the Ping task and
diff --git a/MAC/GCF/RTDB/src/DPanswer.cc b/MAC/GCF/RTDB/src/DPanswer.cc
index 63a5cbea557..f9514c8bdbe 100644
--- a/MAC/GCF/RTDB/src/DPanswer.cc
+++ b/MAC/GCF/RTDB/src/DPanswer.cc
@@ -24,6 +24,7 @@
 #include <Common/LofarLogger.h>	
 
 #include <MACIO/GCF_Event.h>
+#include <GCF/TM/GCF_Scheduler.h>
 #include <DP_Protocol.ph>
 #include "DPanswer.h"
 
@@ -166,7 +167,7 @@ void DPanswer::_dispatchEvent(GCFEvent&	event)
 	memcpy(newEventBuffer + GCFEVENT_LEN, packedBuffer + sizeof(signal) + sizeof(length), length);
 
 	// Finally we can send the reconstructed event.
-	itsTask->dispatch(*pActualEvent, gDummyPort);
+	itsTask->doEvent(*pActualEvent, gDummyPort);
 
 	// and delete it again.
 	delete newEventBuffer;
diff --git a/MAC/GCF/RTDB/test/tDPservice.cc b/MAC/GCF/RTDB/test/tDPservice.cc
index 4b6094e0d8f..54d11813d40 100644
--- a/MAC/GCF/RTDB/test/tDPservice.cc
+++ b/MAC/GCF/RTDB/test/tDPservice.cc
@@ -131,7 +131,7 @@ GCFEvent::TResult tDPservice::final(GCFEvent& e, GCFPortInterface& /*p*/)
 		break;
 	
 	case F_TIMER:
-		stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
@@ -381,12 +381,12 @@ using namespace LOFAR::GCF;
 
 int main(int argc, char* argv[])
 {
-	TM::GCFTask::init(argc, argv);
+	TM::GCFScheduler::instance()->init(argc, argv);
 
 	RTDB::tDPservice test_task("DPStest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	TM::GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/GCF/RTDB/test/tDPservice.h b/MAC/GCF/RTDB/test/tDPservice.h
index 05766104de4..51099722dcb 100644
--- a/MAC/GCF/RTDB/test/tDPservice.h
+++ b/MAC/GCF/RTDB/test/tDPservice.h
@@ -29,6 +29,9 @@
 
 namespace LOFAR {
  namespace GCF {
+  using TM::GCFTask;
+  using TM::GCFPortInterface;
+  using TM::GCFTimerPort;
   namespace RTDB {
 
 class tDPservice : public GCFTask
diff --git a/MAC/GCF/RTDB/test/tPerformanceReport.cc b/MAC/GCF/RTDB/test/tPerformanceReport.cc
index 761f1c3e29e..3325521f456 100644
--- a/MAC/GCF/RTDB/test/tPerformanceReport.cc
+++ b/MAC/GCF/RTDB/test/tPerformanceReport.cc
@@ -116,7 +116,7 @@ GCFEvent::TResult tPerformance::final(GCFEvent& e, GCFPortInterface& /*p*/)
 		break;
 	
 	case F_TIMER:
-		stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
@@ -365,12 +365,12 @@ int main(int argc, char* argv[])
 	NR_OF_DPS = 1;
 	NR_OF_ACTIONS = 1000;
 
-	TM::GCFTask::init(argc, argv);
+	TM::GCFScheduler::instance()->init(argc, argv);
 
 	RTDB::tPerformance test_task("PVSSperformanceTest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	TM::GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/GCF/RTDB/test/tPerformanceReport.h b/MAC/GCF/RTDB/test/tPerformanceReport.h
index bdd54a4f541..12d3baa0b1c 100644
--- a/MAC/GCF/RTDB/test/tPerformanceReport.h
+++ b/MAC/GCF/RTDB/test/tPerformanceReport.h
@@ -32,6 +32,9 @@
 
 namespace LOFAR {
  namespace GCF {
+  using TM::GCFTask;
+  using TM::GCFPortInterface;
+  using TM::GCFTimerPort;
   namespace RTDB {
 /**
  * The tPerformance task receives ECHO_PING events from the Ping task and
diff --git a/MAC/GCF/RTDB/test/tPropertySet.cc b/MAC/GCF/RTDB/test/tPropertySet.cc
index 4b45ada527e..2a53ceafeb7 100644
--- a/MAC/GCF/RTDB/test/tPropertySet.cc
+++ b/MAC/GCF/RTDB/test/tPropertySet.cc
@@ -126,7 +126,7 @@ GCFEvent::TResult tPropertySet::final(GCFEvent& e, GCFPortInterface& /*p*/)
 		break;
 	
 	case F_TIMER:
-		stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
@@ -461,12 +461,12 @@ using namespace LOFAR::GCF;
 
 int main(int argc, char* argv[])
 {
-	TM::GCFTask::init(argc, argv);
+	TM::GCFScheduler::instance()->init(argc, argv);
 
 	RTDB::tPropertySet test_task("PStest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	TM::GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/GCF/RTDB/test/tPropertySet.h b/MAC/GCF/RTDB/test/tPropertySet.h
index 25a6f255fdc..e49e5083ecd 100644
--- a/MAC/GCF/RTDB/test/tPropertySet.h
+++ b/MAC/GCF/RTDB/test/tPropertySet.h
@@ -29,6 +29,9 @@
 
 namespace LOFAR {
  namespace GCF {
+  using TM::GCFTask;
+  using TM::GCFPortInterface;
+  using TM::GCFTimerPort;
   namespace RTDB {
 
 class tPropertySet : public GCFTask
diff --git a/MAC/GCF/RTDB/test/tRTDBPerformance.cc b/MAC/GCF/RTDB/test/tRTDBPerformance.cc
index d72c584a71f..b6ee0c20165 100644
--- a/MAC/GCF/RTDB/test/tRTDBPerformance.cc
+++ b/MAC/GCF/RTDB/test/tRTDBPerformance.cc
@@ -113,7 +113,7 @@ GCFEvent::TResult tPerformance::final(GCFEvent& e, GCFPortInterface& /*p*/)
 		break;
 	
 	case F_TIMER:
-		stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
@@ -394,12 +394,12 @@ int main(int argc, char* argv[])
 		NR_OF_DPS = 10;
 	}
 
-	TM::GCFTask::init(argc, argv);
+	TM::GCFScheduler::instance()->init(argc, argv);
 
 	RTDB::tPerformance test_task("RTDBSpeedTest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	TM::GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/GCF/RTDB/test/tRTDBPerformance.h b/MAC/GCF/RTDB/test/tRTDBPerformance.h
index f64f712620f..cf522895be7 100644
--- a/MAC/GCF/RTDB/test/tRTDBPerformance.h
+++ b/MAC/GCF/RTDB/test/tRTDBPerformance.h
@@ -32,6 +32,9 @@
 
 namespace LOFAR {
  namespace GCF {
+  using TM::GCFTask;
+  using TM::GCFPortInterface;
+  using TM::GCFTimerPort;
   namespace RTDB {
 /**
  * The tPerformance task receives ECHO_PING events from the Ping task and
diff --git a/MAC/GCF/RTDB/test/testQuery.cc b/MAC/GCF/RTDB/test/testQuery.cc
index 60849bd8835..71e562e4427 100644
--- a/MAC/GCF/RTDB/test/testQuery.cc
+++ b/MAC/GCF/RTDB/test/testQuery.cc
@@ -90,7 +90,7 @@ GCFEvent::TResult testQuery::final(GCFEvent& e, GCFPortInterface& /*p*/)
 		break;
 	
 	case F_TIMER:
-		stop();
+		GCFScheduler::instance()->stop();
 		break;
 
 	default:
@@ -118,7 +118,7 @@ GCFEvent::TResult testQuery::waitForChanges(GCFEvent& event, GCFPortInterface& /
 		PVSSresult	result = itsDPservice->query(DPclause, whereClause);
 		if (result != SA_NO_ERROR) {
 			LOG_ERROR ("Taking subscription failed. Bailing out.");
-			stop();
+			GCFScheduler::instance()->stop();
 		}
 	}
 	break;
@@ -128,7 +128,7 @@ GCFEvent::TResult testQuery::waitForChanges(GCFEvent& event, GCFPortInterface& /
 		if (answer.result != SA_NO_ERROR) {
 			LOG_ERROR_STR ("Taking subscription on PVSS-states failed (" << answer.result  <<
 								"). Bailing out.");
-			stop();
+			GCFScheduler::instance()->stop();
 			break;
 		}
 		itsQueryID = answer.QryID;
@@ -184,12 +184,12 @@ int main(int argc, char* argv[])
 	DPclause    = argv[1];
 	whereClause = argv[2];
 
-	TM::GCFTask::init(argc, argv);
+	TM::GCFScheduler::instance()->init(argc, argv);
 
 	RTDB::testQuery test_task("DPStest");  
 	test_task.start(); // make initial transition
 
-	TM::GCFTask::run();
+	TM::GCFScheduler::instance()->run();
 
 	return 0;
 }
diff --git a/MAC/GCF/RTDB/test/testQuery.h b/MAC/GCF/RTDB/test/testQuery.h
index 96fb1af3c35..1e89f310c0a 100644
--- a/MAC/GCF/RTDB/test/testQuery.h
+++ b/MAC/GCF/RTDB/test/testQuery.h
@@ -29,6 +29,9 @@
 
 namespace LOFAR {
  namespace GCF {
+  using TM::GCFTask;
+  using TM::GCFPortInterface;
+  using TM::GCFTimerPort;
   namespace RTDB {
 
 class testQuery : public GCFTask
diff --git a/MAC/GCF/TM/include/GCF/TM/GCF_Fsm.h b/MAC/GCF/TM/include/GCF/TM/GCF_Fsm.h
index 72ee2972b82..513169f3b44 100644
--- a/MAC/GCF/TM/include/GCF/TM/GCF_Fsm.h
+++ b/MAC/GCF/TM/include/GCF/TM/GCF_Fsm.h
@@ -24,11 +24,9 @@
 #define GCF_FSM_H
 
 #include <MACIO/GCF_Event.h>
-#include <GCF/TM/GCF_Protocols.h>
 #include <GCF/TM/GCF_PortInterface.h>
-
-#include <iostream>
-#include <cstdlib>
+#include <GCF/TM/GCF_Protocols.h>
+#include <GCF/TM/GCF_Scheduler.h>
 
 namespace LOFAR {
   using MACIO::GCFEvent;
@@ -37,63 +35,9 @@ namespace LOFAR {
 
 #define TRAN(_target_) \
   { \
-    tran(static_cast<State>(&_target_), __func__, #_target_); \
+    tran(this, static_cast<State>(&_target_), __func__, #_target_); \
   }
 
-/**
- * This type of port can be used to transport internal messages linked to a 
- * port, which does not implement anything of the typical features of a port
- */
-class GCFDummyPort : public GCFPortInterface
-{
-  public:
-    explicit GCFDummyPort (GCFTask* pTask, 
-                  string name, 
-                  int protocol) : 
-      GCFPortInterface(pTask, name, SPP, protocol, false) 
-    {};
-
-    bool close () {return false;}
-    bool open () {return false;}
-
-    ssize_t send (GCFEvent& /*event*/)
-    {	return (0);	}
-    
-
-    ssize_t recv (void* /*buf*/, 
-                  size_t /*count*/) 
-    {	return (0);	}
-
-    long setTimer (long  /*delay_sec*/,
-                   long  /*delay_usec*/,
-                   long  /*interval_sec*/,
-                   long  /*interval_usec*/,
-                   void* /*arg*/) 
-    {	return (0);	}
-
-    long setTimer (double /*delay_seconds*/, 
-                   double /*interval_seconds*/,
-                   void*  /*arg*/)
-    {	return (0);	}
-
-    int cancelTimer (long /*timerid*/, 
-                     void** /*arg*/) 
-    {	return (0);	}
-
-    int cancelAllTimers ()
-    {	return (0);	}
-
-	double timeLeft(long	/*timerID*/)
-    {	return (0);	}
-  
-  private:
-    // not allowed
-    GCFDummyPort();
-    GCFDummyPort(GCFDummyPort&);
-    GCFDummyPort& operator= (GCFDummyPort&);
-
-};
-
 /**
  * Fsm = Finite State Machine
  * All tasks implement their behaviour in terms of a finite state machine. The 
@@ -116,49 +60,80 @@ class GCFDummyPort : public GCFPortInterface
  */
 class GCFFsm
 {
-  protected: // constructors && destructors
-    typedef MACIO::GCFEvent::TResult (GCFFsm::*State)(GCFEvent& event, GCFPortInterface& port); // ptr to state handler type
+public:
+	// ----- Internal type definitions -----
+	// Define the State function_type.
+    typedef GCFEvent::TResult (GCFFsm::*State)(GCFEvent& event, GCFPortInterface& port); // ptr to state handler type
     
-    explicit  GCFFsm (State initial) : _state(initial) {;} 
-
-  private:
-    GCFFsm();
+    /// let the current State from the adapted task execute the event.
+    GCFEvent::TResult doEvent (GCFEvent& 		 event, 
+							   GCFPortInterface& port)
+    { 
+		if (event.signal == F_TRAN) {
+			GCFTranEvent*	tranEvent((GCFTranEvent*)&event);
+			itsState = tranEvent->state;
+			return (GCFEvent::HANDLED);
+		}
+		return (this->*itsState)(event, port); 
+	}
+
+protected: // constructors && destructors
+	// Define TRANEvent
+	struct GCFTranEvent : public GCFEvent
+	{
+		GCFTranEvent() : GCFEvent(F_TRAN)
+		{
+			length = sizeof(GCFTranEvent);
+		}
+		State 	state;
+	};
+
+    explicit  GCFFsm (State initial) : itsState(initial) {
+		itsScheduler = GCFScheduler::instance();
+	}
 
-  public:
     virtual ~GCFFsm () {;}
   
     /// starts the statemachine with a F_ENTRY signal followed by a F_INIT signal
     void initFsm ();
   
-    /// dispatch incomming signals to the adapted task in the current state
-    MACIO::GCFEvent::TResult dispatch (GCFEvent& event, 
-                                GCFPortInterface& port)
-    {
-      return (this->*_state)(event, port);
-    }
-
 	/// send F_QUIt signal
 	void quitFsm();
   
-  protected:
-  
-    /** state transition; will be used by the MACRO TRAN see above
-     * sends a F_EXIT signal to the current state followed by the state transition
-     * and finaly sends a F_ENTRY signal to the new current state
-     * @param target new state
-     * @param from text of the current state
-     * @param to text of the new state
-     */
-    void tran (State target, 
+    // state transition; will be used by the MACRO TRAN see above
+    // sends a F_EXIT signal to the current state followed by the state transition
+    // and finaly sends a F_ENTRY signal to the new current state
+    // @param target new state
+    // @param from text of the current state
+    // @param to text of the new state
+    void tran (GCFFsm*	task,
+			   State target, 
                const char* from, 
                const char* to);
   
-  protected:
-    volatile State _state;
-  
-  private:
-    static GCFDummyPort _gcfPort;
+	// Allow the scheduler to manipulate my eventQueue.
+	friend class GCFScheduler;
+	void queueTaskEvent(GCFEvent&	event, GCFPortInterface&	port);
+	void handleTaskQueue();
+
+private:
+	// Default construction and copying is not allowed.
+    GCFFsm();
+	GCFFsm(const GCFFsm& that);
+	GCFFsm& operator=(const GCFFsm& that);
+	
+	// ----- DATA MEMBERS -----
+	// Structure for the eventqueue
+	typedef struct {
+		GCFEvent*			event;
+		GCFPortInterface*	port;
+	} waitingTaskEvent_t;
+	list<waitingTaskEvent_t*>	itsEventQueue;
+
+    State 			itsState;
+	GCFScheduler*	itsScheduler;
 };
+
   } // namespace TM
  } // namespace GCF
 } // namespace LOFAR
diff --git a/MAC/GCF/TM/include/GCF/TM/GCF_Handler.h b/MAC/GCF/TM/include/GCF/TM/GCF_Handler.h
index 2c379cf1bbc..5cbc4f62ee9 100644
--- a/MAC/GCF/TM/include/GCF/TM/GCF_Handler.h
+++ b/MAC/GCF/TM/include/GCF/TM/GCF_Handler.h
@@ -26,15 +26,11 @@
 //# Includes
 
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace TM 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
 
 //# forward declaration
-class GCFTask;
 
 /**
   This is the pure abstract (interface) class for all different kind of
@@ -84,7 +80,7 @@ class GCFTask;
 
 class GCFHandler
 {
-  public:
+public:
     /// @return true if no other objects use this handler anymore otherwise false
     bool mayDeleted() { return (_usecount == 0);}
     /// increments the uscount
@@ -92,21 +88,17 @@ class GCFHandler
     /// decrements the uscount
     void leave() { _usecount--;}
   
-  protected:
-    GCFHandler();
-    virtual ~GCFHandler() {;}
-
-    friend class GCFTask;
-
     virtual void workProc () = 0;
     virtual void stop () = 0;
+    virtual ~GCFHandler() {;}
 
-  private:
-    //@{ 
-    /// Don't allow copying this object.
+protected:
+    GCFHandler();
+
+private:
+    // Don't allow copying this object.
     GCFHandler (const GCFHandler&);
     GCFHandler& operator= (const GCFHandler&);  
-    //@}
     
     /// count the usage of this handler    
     unsigned int _usecount;
@@ -116,13 +108,4 @@ class GCFHandler
  } // namespace GCF
 } // namespace LOFAR
 
-
-#include <GCF/TM/GCF_Task.h>
-
-using namespace LOFAR::GCF::TM;
-
-inline GCFHandler::GCFHandler() : _usecount(0) 
-{
-  GCFTask::registerHandler(*this);
-}
 #endif
diff --git a/MAC/GCF/TM/include/GCF/TM/GCF_PortInterface.h b/MAC/GCF/TM/include/GCF/TM/GCF_PortInterface.h
index 89329621a8e..68d616d49b3 100644
--- a/MAC/GCF/TM/include/GCF/TM/GCF_PortInterface.h
+++ b/MAC/GCF/TM/include/GCF/TM/GCF_PortInterface.h
@@ -34,6 +34,7 @@
 namespace LOFAR {
  namespace GCF {
   namespace TM {
+	using LOFAR::MACIO::GCFEvent;
 
 // forward declacations
 class GCFTask;
@@ -72,7 +73,7 @@ public:
     /**
     * send/recv functions
     */
-    virtual ssize_t send (LOFAR::MACIO::GCFEvent& event) = 0;
+    virtual ssize_t send (GCFEvent& event) = 0;
     
     virtual ssize_t recv (void* buf, 
                           size_t count) = 0;
@@ -99,6 +100,8 @@ public:
         
 	virtual double	timeLeft(long	timerID) = 0;
 
+    virtual GCFEvent::TResult   dispatch  (GCFEvent& event);
+
     /**
     * Attribute access functions
     */
diff --git a/MAC/GCF/TM/include/GCF/TM/GCF_Protocols.h b/MAC/GCF/TM/include/GCF/TM/GCF_Protocols.h
index f261f5197dd..75ef02085d8 100644
--- a/MAC/GCF/TM/include/GCF/TM/GCF_Protocols.h
+++ b/MAC/GCF/TM/include/GCF/TM/GCF_Protocols.h
@@ -53,6 +53,7 @@ enum {
     F_EXIT_ID,      // state exit; currently unused
     F_INIT_ID,      // initial transition
     F_QUIT_ID,      // final run
+	F_TRAN_ID,		// state transition (internal, never send to FSM)
 };
 
 // convenience macros
@@ -60,6 +61,7 @@ enum {
 #define F_EXIT  F_SIGNAL(F_FSM_PROTOCOL, F_EXIT_ID,  F_IN)
 #define F_INIT  F_SIGNAL(F_FSM_PROTOCOL, F_INIT_ID,  F_IN)
 #define F_QUIT  F_SIGNAL(F_FSM_PROTOCOL, F_QUIT_ID,  F_IN)
+#define F_TRAN  F_SIGNAL(F_FSM_PROTOCOL, F_TRAN_ID,  F_IN)
 
 extern const char* F_FSM_PROTOCOL_names[]; 
 extern const struct protocolStrings F_FSM_PROTOCOL_STRINGS; 
diff --git a/MAC/GCF/TM/include/GCF/TM/GCF_RawPort.h b/MAC/GCF/TM/include/GCF/TM/GCF_RawPort.h
index fa609ae5c78..923b0c4481b 100644
--- a/MAC/GCF/TM/include/GCF/TM/GCF_RawPort.h
+++ b/MAC/GCF/TM/include/GCF/TM/GCF_RawPort.h
@@ -26,6 +26,7 @@
 #include <MACIO/GCF_Event.h>
 #include <GCF/TM/GCF_PortInterface.h>
 #include <GCF/TM/GCF_Task.h>
+#include <GCF/TM/GCF_Scheduler.h>
 #include <Common/lofar_string.h>
 #include <Common/lofar_map.h>
 
@@ -92,6 +93,7 @@ public:
 
 	virtual double	timeLeft(long	timerID);
 
+    virtual GCFEvent::TResult   dispatch(GCFEvent& event);
 protected: 
 	// constructors && destructors
     /// params see constructor of GCFPortInterface
@@ -113,17 +115,26 @@ protected:
     
 	// helper methods
     friend class GCFPort; // to access the setMaster method
-    friend class GTMTimer;
-    friend class GTMFile;
-
-    void schedule_disconnected();
-    void schedule_close();
-    void schedule_connected();
+//    friend class GTMTimer;//
+//    friend class GTMFile; // they all call dispatch
+//    friend class GCFTask; //
+
+    void schedule_disconnected() {
+		GCFEvent	event(F_DISCONNECTED);
+		GCFScheduler::instance()->queueEvent(0, event, this);
+	}
+    void schedule_close() {
+		GCFEvent	event(F_CLOSED);
+		GCFScheduler::instance()->queueEvent(0, event, this);
+	}
+    void schedule_connected() {
+		GCFEvent	event(F_CONNECTED);
+		GCFScheduler::instance()->queueEvent(0, event, this);
+	}
 
     bool                        isSlave () const {return _pMaster != 0;}
     virtual void                setMaster (GCFPort* pMaster) {_pMaster = pMaster;}
 
-    virtual GCFEvent::TResult   dispatch (GCFEvent& event);
     GCFEvent::TResult           recvEvent();
 
     bool                        findAddr (TPeerAddr& addr);
@@ -131,7 +142,10 @@ protected:
     /// returns the original name of the port (given by the user). 
     /// in case it is a slave port an extension is append to the original name 
     string		                getRealName() const;  
-  
+
+	// admin. data member
+    GTMTimerHandler*            _pTimerHandler;
+
 private: 
     /// copying is not allowed.
     GCFRawPort (const GCFRawPort&);
@@ -140,8 +154,8 @@ private:
 	// data member
     GCFPort* 					_pMaster;
 
-	// admin. data member
-    GTMTimerHandler*            _pTimerHandler;
+	// Pointer to scheduler
+	GCFScheduler*				itsScheduler;
 };
   } // namespace TM
  } // namespace GCF
diff --git a/MAC/GCF/TM/include/GCF/TM/GCF_Scheduler.h b/MAC/GCF/TM/include/GCF/TM/GCF_Scheduler.h
new file mode 100644
index 00000000000..bbb6ea2c6dc
--- /dev/null
+++ b/MAC/GCF/TM/include/GCF/TM/GCF_Scheduler.h
@@ -0,0 +1,228 @@
+//#  GCF_Scheduler.h: handles all events for a task.
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  This program is free software; you can redistribute it and/or modify
+//#  it under the terms of the GNU General Public License as published by
+//#  the Free Software Foundation; either version 2 of the License, or
+//#  (at your option) any later version.
+//#
+//#  This program is distributed in the hope that it will be useful,
+//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//#  GNU General Public License for more details.
+//#
+//#  You should have received a copy of the GNU General Public License
+//#  along with this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#ifndef GCF_SCHEDULER_H
+#define GCF_SCHEDULER_H
+
+#include <Common/lofar_list.h>
+#include <Common/lofar_map.h>
+#include <MACIO/GCF_Event.h>
+#include <GCF/TM/GCF_PortInterface.h>
+
+namespace LOFAR {
+  using MACIO::GCFEvent;
+  namespace GCF {
+    namespace TM {
+
+// forward declaration
+class GCFPort;
+class GCFHandler;
+class GCFFsm;
+
+// This type of port can be used to transport internal messages linked to a 
+// port, which does not implement anything of the typical features of a port
+class GCFDummyPort : public GCFPortInterface
+{
+public:
+	GCFDummyPort (GCFTask* pTask, string name, int protocol) : 
+		GCFPortInterface(pTask, name, SPP, protocol, false) 
+	{}
+
+	// Since we inherit from ABC GCFPortInterface we must 'implement' all functions.
+	bool close () 								  { return (false); }
+	bool open () 								  { return (false); }
+	ssize_t send (GCFEvent&) 					  { return (0);	}
+	ssize_t recv (void*, size_t) 				  { return (0);	}
+	long setTimer (long, long, long, long, void*) {	return (0);	}
+	long setTimer (double, double, void*)		  { return (0);	}
+	int  cancelTimer (long, void**)				  { return (0);	}
+	int  cancelAllTimers ()						  { return (0);	} 
+	double timeLeft(long)						  { return (0);	}
+
+private:
+	// not allowed
+	GCFDummyPort();
+	GCFDummyPort(GCFDummyPort&);
+    GCFDummyPort& operator= (GCFDummyPort&);
+};
+
+// This is the base class for all tasks in an application. Different 
+// specialisations of this class results in a number of concurrent finite state 
+// machines with own ports to other tasks (in other processes). 
+// Note: This is not a representation of a 'thread' related to the 
+// multithreading concept.
+class GCFScheduler
+{
+public:  
+	// Construction via singleton mechanism
+	static GCFScheduler*	instance();
+    
+    // Inits a number of services for the GCF based application:
+    // - holds the argc and argv parameters in static data members
+    // - lofar logger(argv[0].log_prop or "mac.log_prop")
+    // - parameterset(argv[0] + ".conf")
+    void init (int argc, char** argv, const string&	logfile = "");
+    
+    // The run method. This starts the event processing loop.
+    // When multiple tasks are declared within the same binary, only
+    // one call to GCFScheduler::run will suffice.
+    // A call to this function will NEVER return (except on stop). 
+    //
+    // @code
+    //     class MyTask : public GCFTask { ... }
+    //
+    //     int main(int argc, char** argv)
+    //     {
+    //         // create two tasks, a and b.
+	//         GCFScheduler*	theSched = GCFScheduler::instance();
+    //         theSched.init(argc, argv);
+    // 
+    //         MyTask a("a");
+    //         MyTask b("b");
+    //         a.start();
+    //         b.start();
+    //         // start the event processing loop
+    //         theSched->run();
+    //     }
+    // 
+    // @endcode
+    //
+	// The method described above has one major drawback: When one task calls 
+	// stop() the others tasks are also immediately stopped. They done get a 
+	// change to stop their actions in a neat way.
+	// In Nov. 2007 the F_QUIT signal was introduced that solves this problem.
+	// When stop is called each task can receive a F_QUIT signal allowing the
+	// task to do its closing actions.
+	// The main loop has to be changed into:
+	//
+	// @code
+    //     class MyTask : public GCFTask { ... }
+    //
+    //     int main(int argc, char** argv)
+    //     {
+    //         // create two tasks, a and b.
+	//         GCFScheduler*	theSched = GCFScheduler::instance();
+    //         theSched.init(argc, argv);
+    // 
+    //         MyTask a("a");
+    //         MyTask b("b");
+    //         a.start();
+    //         b.start();
+	//
+	//		   theSched->setDelayedQuit(true);		// <--
+    //         // start the event processing loop
+    //         theSched->run();
+	//
+	//		   // when stop() was called we continue here
+	//		   a.quit();			// send the F_QUIT signals
+	//		   b.quit();
+	//		   theSched->run(2);	// let it run for another 2 seconds
+    //     }
+    // 
+    // @endcode
+    void run (double	seconds = 0.0);
+    
+    // registers a GCFHandler for the mainloop
+    void registerHandler (GCFHandler& handler);
+    
+    // deregisters a GCFHandler from the mainloop
+    void deregisterHandler (GCFHandler& handler);
+
+    // stops the application; it stops all registered handlers
+    void stop () {  itsDoExit = true; }
+
+	// specificy whether or not F_QUIT signals are send after stop
+	// to allow the tasks to do their final run.
+	void setDelayedQuit(bool	newState) { itsDelayedQuit = newState; }
+ 
+	//  data members
+    //	the command line arguments passed to the application at start-up
+    //	they are set by means of the static init method
+    //    
+    static int _argc;
+    static char** _argv;
+   
+	void queueEvent(GCFFsm*	task, GCFEvent&	event, GCFPortInterface* port);
+	void printEventQueue();
+	void disableQueue() { itsUseQueue = false; }
+
+private:
+	void _addEvent (GCFFsm*	task, GCFEvent&	event, GCFPortInterface* port, GCFEvent::TResult status);
+	GCFEvent::TResult  _sendEvent(GCFFsm* task, GCFEvent& event, GCFPortInterface* port);
+
+    // Singleton
+    GCFScheduler();
+	GCFScheduler(const GCFScheduler&	that);
+	GCFScheduler& operator=(const GCFScheduler& that);
+	~GCFScheduler();
+
+    // handles system signals
+    static void signalHandler(int sig);
+
+	// give a stop signal to all the handlers
+	void stopHandlers();
+
+	void handleEventQueue();
+
+	// --- DATA MEMBERS ---
+	// Structure for the eventqueue
+	typedef struct {
+		GCFEvent*			event;
+		GCFPortInterface*	port;
+		GCFFsm*				task;
+		int					handlingType;
+		int					seqNr;
+	} waitingEvent_t;
+	list<waitingEvent_t*>	theEventQueue;
+
+    // all registered handlers, which should be invoked (workProc) circulair
+    typedef map<GCFHandler*, bool /*valid*/> HandlerMap_t;
+    HandlerMap_t	itsHandlers;
+    HandlerMap_t 	itsTempHandlers;
+
+    /// all registered protocols in the application
+    typedef map<unsigned short, const char**> ProtocolMap_t;
+    ProtocolMap_t	itsProtocols;
+
+    /// indicates wether the application should be stopped or not
+    bool	itsDoExit;
+
+	// Indicates if the tasks will stop immediately after the stop command or
+	// if the will receive a final F_QUIT signal.
+	bool	itsDelayedQuit;
+
+	// whether or not Scheduler was initiated.
+	bool	itsIsInitialized;
+
+	bool	itsUseQueue;
+
+	// Dummy port to be passed in event we make.
+    GCFDummyPort*			itsFrameworkPort;
+
+	static GCFScheduler*	theirGCFScheduler;
+};
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+
+#endif
diff --git a/MAC/GCF/TM/include/GCF/TM/GCF_TCPPort.h b/MAC/GCF/TM/include/GCF/TM/GCF_TCPPort.h
index 605a65847b7..27408416651 100644
--- a/MAC/GCF/TM/include/GCF/TM/GCF_TCPPort.h
+++ b/MAC/GCF/TM/include/GCF/TM/GCF_TCPPort.h
@@ -65,53 +65,63 @@ public:// consturctors && destructors
      */ 
     GCFTCPPort ();
   
-private:  
-    /// copying is not allowed.
-    GCFTCPPort (const GCFTCPPort&);
-    GCFTCPPort& operator= (const GCFTCPPort&);
-
-public:
-    /// desctructor
+    /// destructor
     virtual ~GCFTCPPort ();
   
-public: // GCFPortInterface overloaded/defined methods
+	// GCFPortInterface overloaded/defined methods
     void init (GCFTask& 	 task, 
                const string& name, 
                TPortType 	 type, 
                int 			 protocol, 
                bool 		 transportRawData = false); 
 
-    /**
-     * open/close methods
-     */
+    // open/close methods
     virtual bool open ();
     virtual bool close ();
       
-    /**
-     * send/recv functions
-     */
+    // send/recv functions
     virtual ssize_t send (GCFEvent& event);
     virtual ssize_t recv (void* buf,
                           size_t count);
-public: // GCFTCPPort specific methods    
+
+	// Special auto-open mode that does the retries itself
+	// nrRetries		: -1 = infinite ; How often to retry the open when it fails.
+	// reconnectInterval: After how many seconds after a fail a reconnect attempt will be made.
+	// timeout  		: -1 = infinite ; How long the auto-open attempts may last.
+	//
+	// Note: autoOpen(0,0) acts the same as open()
+	// When both nrRetries and timeout are specified the condition that will be met first will stop the auto open sequence.
+	void autoOpen(uint	nrRetries=5, double	timeout=-1.0, double	reconnectInterval=10.0);
+	virtual GCFEvent::TResult	dispatch(GCFEvent&	event);		// need to overright this one for autoOpen
+
+	// GCFTCPPort specific methods    
     virtual bool accept (GCFTCPPort& port); 
     // addr is local address if getType == (M)SPP
     // addr is remote addres if getType == SAP
-    void setAddr (const TPeerAddr& addr);
-    void setHostName(const string& hostname);
+    void setAddr 	  (const TPeerAddr& addr);
+    void setHostName  (const string& hostname);
     void setPortNumber(unsigned int portNumber);
     string getHostName();
     unsigned int getPortNumber();
 
-private: // helper methods
+private:  
+    /// copying is not allowed.
+    GCFTCPPort (const GCFTCPPort&);
+    GCFTCPPort& operator= (const GCFTCPPort&);
+
+	// helper methods
     friend class SB::ServiceBrokerTask;
     void serviceRegistered(unsigned int result, unsigned int portNumber);
     void serviceUnregistered();
     void serviceInfo(unsigned int result, unsigned int portNumber, const string& host);
     void serviceGone();
+
+	void _handleConnect();
+	void _handleDisconnect();
     
-protected: // data members
-    GTMTCPSocket*   _pSocket;
+	// ----- Data Members -----
+protected: 
+    GTMTCPSocket*   		_pSocket;
 
 private:
     bool					_addrIsSet;
@@ -119,9 +129,15 @@ private:
     string					_host;
     unsigned int			_portNumber;
 	bool					itsFixedPortNr;
+	bool					itsAutoOpen;
+	unsigned int			itsAutoOpenTimer;
+	unsigned int			itsAutoRetryTimer;
+	int						itsAutoRetries;
+	double					itsAutoRetryItv;
     SB::ServiceBrokerTask*	_broker;
 };
 
+
 inline void GCFTCPPort::setHostName(const string& hostname)
 {
 	// assure that hostname is never filled with localname.
@@ -141,12 +157,12 @@ inline void GCFTCPPort::setPortNumber(unsigned int portNumber)
 
 inline string GCFTCPPort::getHostName()
 {
-  return _host;
+	return _host;
 }
 
 inline unsigned int GCFTCPPort::getPortNumber()
 {
-  return _portNumber;
+	return _portNumber;
 }
   } // namespace TM
  } // namespace GCF
diff --git a/MAC/GCF/TM/include/GCF/TM/GCF_Task.h b/MAC/GCF/TM/include/GCF/TM/GCF_Task.h
index 208de542ec4..647a16a80a0 100644
--- a/MAC/GCF/TM/include/GCF/TM/GCF_Task.h
+++ b/MAC/GCF/TM/include/GCF/TM/GCF_Task.h
@@ -23,6 +23,7 @@
 #ifndef GCF_TASK_H
 #define GCF_TASK_H
 
+#include <Common/lofar_list.h>
 #include <Common/lofar_map.h>
 #include <GCF/TM/GCF_Fsm.h>
 
@@ -31,8 +32,6 @@ namespace LOFAR {
     namespace TM {
 
 // forward declaration
-class GCFPort;
-class GCFHandler;
 
 /**
  * This is the base class for all tasks in an application. Different 
@@ -46,7 +45,7 @@ class GCFTask : public GCFFsm
 {
 public:  
 	// constuctors
-    virtual ~GCFTask();
+    virtual ~GCFTask() { }
 
     // "starts" this task; see code example from run method
     void start () { initFsm(); }
@@ -54,135 +53,24 @@ public:
 	// Gives task a final change to end their actions
 	void quit () { quitFsm();	}
     
-    // -- static method --
-    // Inits a number of services for the GCF based application:
-    // - holds the argc and argv parameters in static data members
-    // - lofar logger(argv[0].log_prop or "mac.log_prop")
-    // - parameterset(argv[0] + ".conf")
-    //     
-    static void init (int argc, char** argv, const string&	logfile = "");
-    
-    // The static run method. This starts the event processing loop.
-    // When multiple tasks are declared within the same binary, only
-    // one call to GCFTask::run will suffice.
-    // A call to this function will NEVER return (except on stop). 
-    //
-    // @code
-    //     class MyTask : public GCFTask { ... }
-    //
-    //     int main(int argc, char** argv)
-    //     {
-    //         // create two tasks, a and b.
-    //         GCFTask::init(argc, argv);
-    // 
-    //         MyTask a("a");
-    //         MyTask b("b");
-    //         a.start();
-    //         b.start();
-    //         // start the event processing loop
-    //         GCFTask::run();
-    //     }
-    // 
-    // @endcode
-    //
-	// The method described above has one major drawback: When one task calls 
-	// stop() the others tasks are also immediately stopped. They done get a 
-	// change to stop their actions in a neat way.
-	// In Nov. 2007 the F_QUIT signal was introduced that solves this problem.
-	// When stop is called each task can receive a F_QUIT signal allowing the
-	// task to do its closing actions.
-	// The main loop has to be changed into:
-	//
-	// @code
-    //     class MyTask : public GCFTask { ... }
-    //
-    //     int main(int argc, char** argv)
-    //     {
-    //         // create two tasks, a and b.
-    //         GCFTask::init(argc, argv);
-    // 
-    //         MyTask a("a");
-    //         MyTask b("b");
-    //         a.start();
-    //         b.start();
-	//		   GCFTask::setDelayedQuit(true);		// <--
-	//
-    //         // start the event processing loop
-    //         GCFTask::run();
-	//
-	//		   // when stop() was called we continue here
-	//		   a.quit();		// send the F_QUIT signals
-	//		   b.quit();
-	//		   GCFTask::run(2);	// let it run for another 2 seconds
-    //     }
-    // 
-    // @endcode
-
-
-    static void run (double	seconds = 0.0);
-    
-    // registers a GCFHandler for the mainloop
-    static void registerHandler (GCFHandler& handler);
-    
-    // deregisters a GCFHandler from the mainloop
-    static void deregisterHandler (GCFHandler& handler);
-
-    // stops the application; it stops all registered handlers
-    static void stop () {  _doExit = true; }
-
-	// specificy whether or not F_QUIT signals are send after stop
-	// to allow the tasks to do their final run.
-	static void setDelayedQuit(bool	newState) { _delayedQuit = newState; }
- 
     // Get the name of the task.
     const string& getName () const {return _name;}
     // Set the name of the task.
     void setName (string& name) {_name = name;}
 
-	//  data members
-    //	the command line arguments passed to the application at start-up
-    //	they are set by means of the static init method
-    //    
-    static int _argc;
-    static char** _argv;
-   
 protected:
-    explicit GCFTask (State initial, 
-                      const string& name); 
+    explicit GCFTask (State initial, const string& name) :
+		GCFFsm(initial), _name(name) { }
 
 private:
-    friend class GCFPort;
-    friend class GCFRawPort;
-
     // Is private to avoid initialising a task without giving an inital state and the task name
     GCFTask();
   
-    // handles system signals
-    static void signalHandler(int sig);
-
-	// give a stop signal to all the handlers
-	static void stopHandlers();
-
 	// --- DATA MEMBERS ---
     // the task name
     string _name;
-    // all registered handlers, which should be invoked (workProc) circulair
-    typedef map<GCFHandler*, bool /*valid*/> THandlers;
-    static THandlers _handlers;
-    static THandlers _tempHandlers;
-
-    /// all registered protocols in the application
-    typedef map<unsigned short, const char**> TProtocols;
-    static TProtocols _protocols;
-
-    /// indicates wether the application should be stopped or not
-    static bool _doExit;
-
-	// Indicates if the tasks will stop immediately after the stop command or
-	// if the will receive a final F_QUIT signal.
-	static bool _delayedQuit;
-
 };  
+
   } // namespace TM
  } // namespace GCF
 } // namespace LOFAR
diff --git a/MAC/GCF/TM/include/GCF/TM/Makefile.am b/MAC/GCF/TM/include/GCF/TM/Makefile.am
index 360d4adea89..56eac1648e4 100644
--- a/MAC/GCF/TM/include/GCF/TM/Makefile.am
+++ b/MAC/GCF/TM/include/GCF/TM/Makefile.am
@@ -1,6 +1,7 @@
 pkgincludedir = $(includedir)/GCF/TM
 pkginclude_HEADERS = Package__Version.h  \
 	GCF_Control.h \
+	GCF_Scheduler.h \
 	GCF_DevicePort.h \
 	GCF_ETHRawPort.h \
 	GCF_Fsm.h \
diff --git a/MAC/GCF/TM/src/GCF_Fsm.cc b/MAC/GCF/TM/src/GCF_Fsm.cc
index 12925989d43..2153b31437e 100644
--- a/MAC/GCF/TM/src/GCF_Fsm.cc
+++ b/MAC/GCF/TM/src/GCF_Fsm.cc
@@ -25,47 +25,39 @@
 #include <Common/LofarLogger.h>
 #include <Common/StringUtil.h>
 #include <GCF/TM/GCF_Fsm.h>
-#include <GTM_Defines.h>
 
 namespace LOFAR {
  using MACIO::GCFEvent;
  namespace GCF {
   namespace TM {
 
-// static data member initialisation
-GCFDummyPort GCFFsm::_gcfPort(0, "GCFFSM", F_FSM_PROTOCOL);
-
 //
 // initFsm()
 //
 void GCFFsm::initFsm()
 {
-	GCFEvent e;
-	e.signal = F_ENTRY;
-	(void)(this->*_state)(e, _gcfPort); // entry signal
-	e.signal = F_INIT;
-	if (GCFEvent::HANDLED != (this->*_state)(e, _gcfPort)) { // initial transition
-		LOG_FATAL(LOFAR::formatString (
-			"Fsm::init: initial transition F_SIGNAL(F_FSM_PROTOCOL, F_INIT) not handled."));
-		exit(1);
-	}
+	GCFEvent	entryEvent(F_ENTRY);
+	itsScheduler->queueEvent(this, entryEvent, 0);
+
+	GCFEvent	initEvent(F_INIT);
+	itsScheduler->queueEvent(this, initEvent, 0);
 }
 
 //
 // tran(target, from, to)
 //
-void GCFFsm::tran(State target, const char* from, const char* to)
+void GCFFsm::tran(GCFFsm*	task, State target, const char* from, const char* to)
 {
-	GCFEvent e;
-	e.signal = F_EXIT;
-	(void)(this->*_state)(e, _gcfPort); // exit signal
+	GCFEvent	exitEvent(F_EXIT);
+	itsScheduler->queueEvent(this, exitEvent, 0);
 
 	LOG_DEBUG(LOFAR::formatString ( "State transition to %s <<== %s", to, from));
+	GCFTranEvent	tranEvent;
+	tranEvent.state = target;
+	itsScheduler->queueEvent(this, tranEvent, 0);
 
-	_state = target; // state transition
-
-	e.signal = F_ENTRY;
-	(void)(this->*_state)(e, _gcfPort); // entry signal
+	GCFEvent	entryEvent(F_ENTRY);
+	itsScheduler->queueEvent(this, entryEvent, 0);
 }
 
 //
@@ -73,9 +65,45 @@ void GCFFsm::tran(State target, const char* from, const char* to)
 //
 void GCFFsm::quitFsm()
 {
-	GCFEvent	event;
-	event.signal = F_QUIT;
-	(void)(this->*_state)(event, _gcfPort);
+	GCFEvent	quitEvent(F_QUIT);
+	itsScheduler->queueEvent(this, quitEvent, 0);
+}
+
+//
+// queueTaskEvent(event,port)
+//
+// Add the given event/port pair to the eventqueue of the task. This queue is emptied as soon as the
+// state of the task is switched.
+//
+void GCFFsm::queueTaskEvent(GCFEvent&	event, GCFPortInterface&	port)
+{
+	waitingTaskEvent_t*		newEntry = new waitingTaskEvent_t;
+	newEntry->event = &event;
+	newEntry->port  = &port;
+	itsEventQueue.push_back(newEntry);
+}
+
+//
+// handleTaskQueue()
+//
+// Send all the events in the task queue ONCE to the task. If the task does not handle them log this
+// problem and continue.
+//
+void GCFFsm::handleTaskQueue()
+{
+	while (!itsEventQueue.empty()) {
+		waitingTaskEvent_t*		theEvent = itsEventQueue.front();
+		LOG_DEBUG_STR("handleTaskQueue:(" << eventName(*(theEvent->event)) << "@" << theEvent->port->getName() << ")");
+		
+		GCFEvent::TResult result = (this->*itsState)(*(theEvent->event), *(theEvent->port));
+		if (result != GCFEvent::HANDLED) {
+			LOG_WARN_STR("Result on taskEvent " << eventName(*(theEvent->event)) << 
+						  " was NOT HANDLED, DELETING event.");
+		}
+		itsEventQueue.pop_front();
+		delete theEvent->event;
+		delete theEvent;
+	}
 }
 
   } // namespace TM
diff --git a/MAC/GCF/TM/src/GCF_Handler.cc b/MAC/GCF/TM/src/GCF_Handler.cc
new file mode 100644
index 00000000000..9896cc8a695
--- /dev/null
+++ b/MAC/GCF/TM/src/GCF_Handler.cc
@@ -0,0 +1,39 @@
+//#  GCF_Handler.cc: generic handler class
+//#
+//#  Copyright (C) 2002-2009
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  This program is free software; you can redistribute it and/or modify
+//#  it under the terms of the GNU General Public License as published by
+//#  the Free Software Foundation; either version 2 of the License, or
+//#  (at your option) any later version.
+//#
+//#  This program is distributed in the hope that it will be useful,
+//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//#  GNU General Public License for more details.
+//#
+//#  You should have received a copy of the GNU General Public License
+//#  along with this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#include <lofar_config.h>
+#include <GCF/TM/GCF_Handler.h>
+#include <GCF/TM/GCF_Scheduler.h>
+
+namespace LOFAR {
+  namespace GCF {
+    namespace TM {
+
+GCFHandler::GCFHandler() : 
+	_usecount(0) 
+{
+	GCFScheduler::instance()->registerHandler(*this);
+}
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
diff --git a/MAC/GCF/TM/src/GCF_Protocols.cc b/MAC/GCF/TM/src/GCF_Protocols.cc
index 4ff7bbaf42c..18b8710d2c3 100644
--- a/MAC/GCF/TM/src/GCF_Protocols.cc
+++ b/MAC/GCF/TM/src/GCF_Protocols.cc
@@ -43,7 +43,8 @@ const char* F_FSM_PROTOCOL_names[] =
   "F_ENTRY",
   "F_EXIT",
   "F_INIT",
-  "F_QUIT"
+  "F_QUIT",
+  "F_TRAN"
 };
 
 //
@@ -64,7 +65,7 @@ const char* F_PORT_PROTOCOL_names[] =
 };
 
 const struct protocolStrings F_FSM_PROTOCOL_STRINGS = {
-	5, 0, F_FSM_PROTOCOL_names, 0
+	6, 0, F_FSM_PROTOCOL_names, 0
 };
 
 const struct protocolStrings F_PORT_PROTOCOL_STRINGS = {
diff --git a/MAC/GCF/TM/src/GCF_Scheduler.cc b/MAC/GCF/TM/src/GCF_Scheduler.cc
new file mode 100644
index 00000000000..6413f295d0e
--- /dev/null
+++ b/MAC/GCF/TM/src/GCF_Scheduler.cc
@@ -0,0 +1,420 @@
+//#  GCF_Task.cc: task class which encapsulates a task and its behaviour as a 
+//#  finite state machine (FSM).
+//#
+//#  Copyright (C) 2002-2003
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  This program is free software; you can redistribute it and/or modify
+//#  it under the terms of the GNU General Public License as published by
+//#  the Free Software Foundation; either version 2 of the License, or
+//#  (at your option) any later version.
+//#
+//#  This program is distributed in the hope that it will be useful,
+//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//#  GNU General Public License for more details.
+//#
+//#  You should have received a copy of the GNU General Public License
+//#  along with this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#include <lofar_config.h>
+#include <Common/LofarLogger.h>
+#include <Common/lofar_fstream.h>
+#include <Common/LofarLocators.h>
+#include <Common/ParameterSet.h>
+#include <Common/hexdump.h>
+
+#include <GCF/TM/GCF_PortInterface.h>
+#include <GCF/TM/GCF_Protocols.h>
+#include <GCF/TM/GCF_Handler.h>
+#include <GCF/TM/GCF_Task.h>
+#include <GCF/TM/GCF_Scheduler.h>
+
+#include <signal.h>
+#include <sys/time.h>
+
+namespace LOFAR {
+  namespace GCF {
+    namespace TM {
+
+// static member initialisation
+GCFScheduler*		GCFScheduler::theirGCFScheduler = 0;
+int 				GCFScheduler::_argc = 0;
+char** 				GCFScheduler::_argv = 0;
+
+//
+// instance()
+//
+GCFScheduler*	GCFScheduler::instance()
+{
+	if (theirGCFScheduler == 0) {
+		theirGCFScheduler = new GCFScheduler();
+	}
+	return (theirGCFScheduler);
+}
+
+//
+// Default construction
+//
+GCFScheduler::GCFScheduler() :
+	itsDoExit		(false),
+	itsDelayedQuit	(false),
+	itsIsInitialized(false),
+	itsUseQueue		(true),
+	itsFrameworkPort(0)
+{
+	cout << "Creation of GCFScheduler" << endl;
+ 	itsFrameworkPort = new GCFDummyPort(0, "FrameWork", F_FSM_PROTOCOL);
+	ASSERTSTR(itsFrameworkPort, "Cannot construct a port for the framework");
+}
+
+//
+// ~GCFScheduler()
+//
+GCFScheduler::~GCFScheduler()
+{
+	delete itsFrameworkPort;
+
+	// clear the maps
+}
+
+//
+// init(argc, argv, logfile)
+//
+void GCFScheduler::init(int argc, char** argv, const string&	logfile)
+{
+	ASSERTSTR(!itsIsInitialized, "Attempt to initialized the GCFScheduler twice");
+
+	_argc = argc;
+	_argv = argv;
+
+	// Try to open the log_prop file, if process has its own log_prop file then use it
+	// the INIT_LOGGER otherwise use the default mac.log_prop
+	ConfigLocator	aCL;
+	string 			procName(basename(argv[0]));
+	string			logPropFile(procName + ".log_prop");
+	// First try logpropfile <task>.log_prop
+	if (aCL.locate(logPropFile) == "") {
+		// locator could not find it try defaultname
+		logPropFile = "mac.log_prop";
+	}
+
+	if (logfile.empty()) {
+		INIT_LOGGER(aCL.locate(logPropFile).c_str());
+		LOG_INFO_STR ("Initialized logsystem with: " << aCL.locate(logPropFile));
+	}
+	else {
+		INIT_VAR_LOGGER(aCL.locate(logPropFile).c_str(), logfile);
+		LOG_INFO_STR ("Initialized logsystem with: " << aCL.locate(logPropFile) <<
+						"," << logfile);
+	}
+
+	// Read in the ParameterSet of the task (<task>.conf)
+	ParameterSet*	pParamSet = globalParameterSet();
+	string			configFile(aCL.locate(procName + ".conf"));
+	if (!configFile.empty()) {
+		LOG_INFO_STR ("Using parameterfile: " << configFile);
+		pParamSet->adoptFile(configFile);
+	}
+	else {
+		LOG_INFO_STR ("NO DEFAULT PARAMETERSET FOUND");
+	}
+
+	registerProtocol(F_FSM_PROTOCOL, F_FSM_PROTOCOL_STRINGS);
+	registerProtocol(F_PORT_PROTOCOL,F_PORT_PROTOCOL_STRINGS);
+
+	itsIsInitialized = true;
+}
+
+//
+// run(secondsToRun)
+//
+void GCFScheduler::run(double maxSecondsToRun)
+{
+	// catch terminate signals
+	signal(SIGINT,  GCFScheduler::signalHandler);
+	signal(SIGTERM, GCFScheduler::signalHandler);
+	signal(SIGPIPE, SIG_IGN);
+
+	double	terminateTime(0.0);
+	struct timeval	TV;
+	if (maxSecondsToRun) {
+		LOG_INFO_STR("Program execution stops over " << maxSecondsToRun << " seconds");
+		gettimeofday(&TV, 0);
+		terminateTime = TV.tv_sec + (TV.tv_usec / 10000000) + maxSecondsToRun;
+	}
+
+	LOG_DEBUG("Entering main loop of GCFScheduler");
+
+	// always start with emptying the already queued events
+	handleEventQueue();
+
+	// THE MAIN LOOP OF THE MAC PROCESS
+	// can only be interrupted/stopped by calling stop or terminating the application
+	while (!itsDoExit) {
+		// new handlers can be add during processing the workProc
+		// thus a temp handler map is used
+		itsTempHandlers.clear();
+		itsTempHandlers.insert(itsHandlers.begin(), itsHandlers.end()); 
+//		LOG_DEBUG_STR("Nr of handlers: " << itsHandlers.size());
+		for (HandlerMap_t::iterator iter = itsTempHandlers.begin() ; 
+								iter != itsTempHandlers.end() && !itsDoExit; ++iter) {
+			if (iter->second) {
+				iter->first->workProc();
+				handleEventQueue();
+			}
+		} // for
+
+		// time to quit?
+		if (maxSecondsToRun) {
+			gettimeofday(&TV, 0);
+			if ((TV.tv_sec + (TV.tv_usec / 10000000)) >= terminateTime) {
+				itsDoExit = true;
+			}
+		}
+	} // while
+
+	if (!itsDelayedQuit) {
+		stopHandlers();
+	}
+	else {
+		itsDelayedQuit = false;	// never delay twice
+		itsDoExit = false;		// we will run again
+	}
+}
+
+//
+// stopHandlers()
+//
+// An application can be stopped in two ways, a task itself may call stop() or
+// the user may kill the program.
+//
+void GCFScheduler::stopHandlers()
+{
+	for (HandlerMap_t::iterator iter = itsHandlers.begin() ; iter != itsHandlers.end() ; ++iter) {
+		if (iter->second)  {	// if pointer is still valid
+			iter->first->stop();	// give handler a way of stopping in a neat way
+		}
+	} 
+
+	// STEP 2
+	LOG_INFO("Process is stopped! Possible reasons: 'stop' called or terminated");
+	GCFHandler* pHandler(0);
+	for (HandlerMap_t::iterator iter = itsHandlers.begin() ; iter != itsHandlers.end(); ++iter) {
+		if (!iter->second)  {
+			continue; // handler pointer is not valid anymore, 
+		}
+		// because this handler was deleted by the user
+		pHandler = iter->first;
+		pHandler->leave(); // "process" is also a handler user, see registerHandler
+		if (pHandler->mayDeleted())  { // no other object uses this handler anymore?
+			delete pHandler;
+		}
+	} 
+
+	itsHandlers.clear();
+}
+
+//
+// registerHandler(handler)
+//
+// NOTE: There are only a few handlers defined, timerHandler, fileHandler, PVSS Handler.
+//	Those handlers handle the work of all 'ports' of that type. E.g. the timerHandler handles
+// 	the decrement of all timers defined in all tasks!!!!
+//
+void GCFScheduler::registerHandler(GCFHandler& handler)
+{
+	LOG_TRACE_OBJ("GCFScheduler::registerHandler");
+	itsHandlers[&handler] = true; // valid pointer
+	handler.use(); // released after stop
+}
+
+//
+// deregisterHandler(handler)
+//
+void GCFScheduler::deregisterHandler(GCFHandler& handler)
+{
+	LOG_TRACE_OBJ("GCFScheduler::deregisterHandler");
+	HandlerMap_t::iterator iter = itsTempHandlers.find(&handler);
+	if (iter != itsTempHandlers.end()) {
+		iter->second = false; 	// pointer will be made invalid because the user 
+								// deletes the handler by itself                          
+	}
+	itsHandlers.erase(&handler);
+}
+
+//
+// _sendEvent
+//
+GCFEvent::TResult GCFScheduler::_sendEvent(GCFFsm* task, GCFEvent& event, GCFPortInterface*    port)
+{
+	if (task) {
+		return (task->doEvent(event, port ? *port : *itsFrameworkPort));
+	}
+	return(port->dispatch(event));
+}
+
+//
+// queueEvent
+//
+void GCFScheduler::queueEvent(GCFFsm* task, GCFEvent& event, GCFPortInterface*    port)
+{
+	if (!itsUseQueue) {
+		_sendEvent(task, event, port);
+		return;
+	}
+
+	// Framework events are always queued,
+	if (F_EVT_PROTOCOL(event) == F_FSM_PROTOCOL || F_EVT_PROTOCOL(event) == F_PORT_PROTOCOL) {
+		_addEvent(task, event, port, GCFEvent::NOT_HANDLED);
+		return;
+	}
+
+	// Events not generated by the framework are send immediately to the task to avoid copying.
+	GCFEvent::TResult	status;
+	if ((status = _sendEvent(task, event, port)) == GCFEvent::HANDLED) {
+		return;	// its handled, we saved ourselves a copy.
+	}
+
+	switch (status) {
+	case GCFEvent::NOT_HANDLED:
+		LOG_TRACE_COND_STR("IGNORING event " << eventName(event) << 
+					  " because return status is NOT_HANDLED");
+		break;
+
+	case GCFEvent::NEXT_STATE:
+		LOG_TRACE_COND("Moving event to eventQ of task, waiting there for state switch");
+		task->queueTaskEvent(*(event.clone()), *port);
+		break;
+	} // switch
+}
+
+//
+// _addEvent(task, event, port)
+//
+// Should only be called direct after an (external) event was received at a port.
+//
+void GCFScheduler::_addEvent(GCFFsm*			task, GCFEvent&			event, 
+							 GCFPortInterface*	port, GCFEvent::TResult	status)
+{
+	waitingEvent_t*	newWE = new waitingEvent_t;
+	newWE->task = task;
+	newWE->port = (port ? port : itsFrameworkPort);
+	newWE->handlingType = 1;	// TODO: do something with this irt seqNr and place in queue
+	newWE->seqNr = 0;
+	newWE->event = event.clone();
+
+	string	taskName((task ? ((GCFTask*)task)->getName() : "?"));
+	LOG_TRACE_STAT_STR("theEventQueue.push(" << eventName(event) << "@" << newWE->port->getName() << 
+				  " for " << taskName << ") => " << theEventQueue.size() + 1);
+
+	theEventQueue.push_back(newWE);
+}
+
+//
+// handleEventQueue
+//
+void GCFScheduler::handleEventQueue()
+{
+	if (!itsUseQueue) {
+		return;
+	}
+
+	printEventQueue();
+
+	int	eventsInQ = theEventQueue.size(); // only handle the event that are in the queue NOW.
+	for (int eventNr = 0; eventNr < eventsInQ; eventNr++) {
+		waitingEvent_t*		theQueueEntry = theEventQueue.front();
+
+		string	taskName((theQueueEntry->task ? ((GCFTask*)theQueueEntry->task)->getName() : "?"));
+		LOG_TRACE_STAT_STR("theEventQueue.pop(" << eventName(*(theQueueEntry->event)) << "@" << 
+					   theQueueEntry->port->getName() << " for " << taskName << 
+					   ") <= " << theEventQueue.size());
+
+		// TODO: add handling dependant from the handlingType
+		GCFEvent::TResult	status = _sendEvent(theQueueEntry->task, *(theQueueEntry->event), 
+												theQueueEntry->port);
+	
+		// Handle message according to return status.
+		bool	handled(true);
+		if (F_EVT_PROTOCOL(*(theQueueEntry->event)) == F_FSM_PROTOCOL) {
+			// FSM events are never send again, you get one shot only.
+			if (status != GCFEvent::HANDLED) {
+				LOG_WARN_STR("Event " << eventName(*(theQueueEntry->event)) << " in task " << taskName << 
+							 " NOT HANDLED, deleting it");
+			}
+			// when this command was an entry in a new state, empty the task queue first
+			if (theQueueEntry->event->signal == F_ENTRY) {
+				theQueueEntry->task->handleTaskQueue();
+			}
+		}
+		else { // all other protocols
+			switch (status) {
+			case GCFEvent::HANDLED:
+				break;
+
+			case GCFEvent::NOT_HANDLED:
+//				LOG_DEBUG("Returning event to the queue because status is NOT_HANDLED");
+//				theEventQueue.push_back(theQueueEntry);
+//				handled = false;
+				LOG_TRACE_COND_STR("DELETING event " << eventName(*(theQueueEntry->event)) << 
+							  " because return status is NOT_HANDLED");
+				handled = true;
+				break;
+
+			case GCFEvent::NEXT_STATE:
+				LOG_TRACE_COND("Moving event to eventQ of task, waiting there for state switch");
+				theQueueEntry->task->queueTaskEvent(*(theQueueEntry->event), *(theQueueEntry->port));
+				handled = false;
+				break;
+			} // switch
+		} // else
+
+		// throw away the handled event
+		theEventQueue.pop_front();
+		if (handled) {
+			LOG_TRACE_STAT_STR("Event " << eventName(*(theQueueEntry->event)) << " in task " << taskName << 
+							 " removed from queue");
+			if (status != GCFEvent::NEXT_STATE) {
+				delete theQueueEntry->event;
+			}
+			delete theQueueEntry;
+		}
+		
+	} // for
+}
+
+//
+// printEventQueue()
+//
+void GCFScheduler::printEventQueue()
+{
+	list<waitingEvent_t*>::iterator		iter = theEventQueue.begin();
+	list<waitingEvent_t*>::iterator		end  = theEventQueue.end();
+	int		nr(1);	
+	while (iter != end) {
+		string	taskName((*iter)->task ? ((GCFTask*)((*iter)->task))->getName() : "?");
+		LOG_TRACE_STAT_STR("theEventQueue[" << nr << "] = (" << eventName(*((*iter)->event)) << "@" << 
+					   (*iter)->port->getName() << " for " << taskName << ")");
+		nr++;
+		++iter;
+	}
+}
+
+//
+// signalHandler(sig)
+//
+void GCFScheduler::signalHandler(int sig)
+{
+	if ((sig == SIGINT) || (sig == SIGTERM)) {
+		GCFScheduler::instance()->stop();
+	}
+}                                            
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
diff --git a/MAC/GCF/TM/src/GCF_Task.cc b/MAC/GCF/TM/src/GCF_Task.cc
deleted file mode 100644
index dfb89807544..00000000000
--- a/MAC/GCF/TM/src/GCF_Task.cc
+++ /dev/null
@@ -1,238 +0,0 @@
-//#  GCF_Task.cc: task class which encapsulates a task and its behaviour as a 
-//#  finite state machine (FSM).
-//#
-//#  Copyright (C) 2002-2003
-//#  ASTRON (Netherlands Foundation for Research in Astronomy)
-//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
-//#
-//#  This program is free software; you can redistribute it and/or modify
-//#  it under the terms of the GNU General Public License as published by
-//#  the Free Software Foundation; either version 2 of the License, or
-//#  (at your option) any later version.
-//#
-//#  This program is distributed in the hope that it will be useful,
-//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//#  GNU General Public License for more details.
-//#
-//#  You should have received a copy of the GNU General Public License
-//#  along with this program; if not, write to the Free Software
-//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-//#
-//#  $Id$
-
-#include <lofar_config.h>
-#include <Common/LofarLogger.h>
-
-#include <GCF/TM/GCF_Protocols.h>
-#include <GCF/TM/GCF_Task.h>
-#include <GTM_Defines.h>
-#include <GCF/TM/GCF_Handler.h>
-
-#include <GCF/TM/GCF_PortInterface.h>
-
-#include <Common/lofar_fstream.h>
-#include <Common/LofarLocators.h>
-#include <Common/ParameterSet.h>
-using std::ifstream;
-
-#include <signal.h>
-#include <sys/time.h>
-
-namespace LOFAR {
-  namespace GCF {
-    namespace TM {
-
-// static member initialisation
-bool				GCFTask::_doExit = false;
-GCFTask::THandlers	GCFTask::_handlers;
-GCFTask::THandlers	GCFTask::_tempHandlers;
-GCFTask::TProtocols	GCFTask::_protocols;
-int 				GCFTask::_argc = 0;
-char** 				GCFTask::_argv = 0;
-bool				GCFTask::_delayedQuit = false;
-
-//
-// GCFTask(state, name)
-//
-GCFTask::GCFTask(State initial, const string& name) :
-  GCFFsm(initial), _name(name)
-{
-	// new style registration
-	registerProtocol(F_FSM_PROTOCOL, F_FSM_PROTOCOL_STRINGS);
-	registerProtocol(F_PORT_PROTOCOL,F_PORT_PROTOCOL_STRINGS);
-}
-
-//
-// ~GCFTask()
-//
-GCFTask::~GCFTask()
-{
-}
-
-//
-// init(argc, argv, logfile)
-//
-void GCFTask::init(int argc, char** argv, const string&	logfile)
-{
-	_argc = argc;
-	_argv = argv;
-
-	// Try to open the log_prop file, if process has its own log_prop file then use it
-	// the INIT_LOGGER otherwise use the default mac.log_prop
-	ConfigLocator	aCL;
-	string 			procName(basename(argv[0]));
-	string			logPropFile(procName + ".log_prop");
-	// First try logpropfile <task>.log_prop
-	if (aCL.locate(logPropFile) == "") {
-		// locator could not find it try defaultname
-		logPropFile = "mac.log_prop";
-	}
-
-	if (logfile.empty()) {
-		INIT_LOGGER(aCL.locate(logPropFile).c_str());
-		LOG_INFO_STR ("Initialized logsystem with: " << aCL.locate(logPropFile));
-	}
-	else {
-		INIT_VAR_LOGGER(aCL.locate(logPropFile).c_str(), logfile);
-		LOG_INFO_STR ("Initialized logsystem with: " << aCL.locate(logPropFile) <<
-						"," << logfile);
-	}
-
-	// Read in the ParameterSet of the task (<task>.conf)
-	ParameterSet*	pParamSet = globalParameterSet();
-	string			configFile(aCL.locate(procName + ".conf"));
-	if (!configFile.empty()) {
-		LOG_INFO_STR ("Using parameterfile: " << configFile);
-		pParamSet->adoptFile(configFile);
-	}
-	else {
-		LOG_INFO_STR ("NO DEFAULT PARAMETERSET FOUND");
-	}
-
-	if (_doExit) {
-		exit(-1);
-	}
-}
-
-//
-// run(secondsToRun)
-//
-void GCFTask::run(double maxSecondsToRun)
-{
-	// catch terminate signals
-	signal(SIGINT,  GCFTask::signalHandler);
-	signal(SIGTERM, GCFTask::signalHandler);
-	signal(SIGPIPE, SIG_IGN);
-
-	double	terminateTime(0.0);
-	struct timeval	TV;
-	if (maxSecondsToRun) {
-		LOG_INFO_STR("Program execution stops over " << maxSecondsToRun << " seconds");
-		gettimeofday(&TV, 0);
-		terminateTime = TV.tv_sec + (TV.tv_usec / 10000000) + maxSecondsToRun;
-	}
-
-	// THE MAIN LOOP OF THE MAC PROCESS
-	// can only be interrupted/stopped by calling stop or terminating the application
-	while (!_doExit) {
-		// new handlers can be add during processing the workProc
-		// thus a temp handler map is used
-		_tempHandlers.clear();
-		_tempHandlers.insert(_handlers.begin(), _handlers.end()); 
-		for (THandlers::iterator iter = _tempHandlers.begin() ;
-				iter != _tempHandlers.end() && !_doExit; ++iter) {
-			if (iter->second) {
-				iter->first->workProc();
-			}
-		} // for
-
-		// time to quit?
-		if (maxSecondsToRun) {
-			gettimeofday(&TV, 0);
-			if ((TV.tv_sec + (TV.tv_usec / 10000000)) >= terminateTime) {
-				_doExit = true;
-			}
-		}
-	} // while
-
-	if (!_delayedQuit) {
-		stopHandlers();
-	}
-	else {
-		_delayedQuit = false;	// never delay twice
-		_doExit = false;		// we will run again
-	}
-}
-
-//
-// stopHandlers()
-//
-// An application can be stopped in two ways, a task itself may call stop() or
-// the user may kill the program.
-//
-void GCFTask::stopHandlers()
-{
-	for (THandlers::iterator iter = _handlers.begin() ; iter != _handlers.end() ; ++iter) {
-		if (iter->second)  {	// if pointer is still valid
-			iter->first->stop();	// give handler a way of stopping in a neat way
-		}
-	} 
-
-	// STEP 2
-	LOG_INFO("Process is stopped! Possible reasons: 'stop' called or terminated");
-	GCFHandler* pHandler(0);
-	for (THandlers::iterator iter = _handlers.begin() ; iter != _handlers.end(); ++iter) {
-		if (!iter->second)  {
-			continue; // handler pointer is not valid anymore, 
-		}
-		// because this handler was deleted by the user
-		pHandler = iter->first;
-		pHandler->leave(); // "process" is also a handler user, see registerHandler
-		if (pHandler->mayDeleted())  { // no other object uses this handler anymore?
-			delete pHandler;
-		}
-	} 
-
-	_handlers.clear();
-}
-
-//
-// registerHandler(handler)
-//
-// NOTE: There are only a few handlers defined, timerHandler, fileHandler, PVSS Handler.
-//	Those handlers handle the work of all 'ports' of that type. E.g. the timerHandler handles
-// 	the decrement of all timers defined in all tasks!!!!
-//
-void GCFTask::registerHandler(GCFHandler& handler)
-{
-	_handlers[&handler] = true; // valid pointer
-	handler.use(); // released after stop
-}
-
-//
-// deregisterHandler(handler)
-//
-void GCFTask::deregisterHandler(GCFHandler& handler)
-{
-	THandlers::iterator iter = _tempHandlers.find(&handler);
-	if (iter != _tempHandlers.end()) {
-		iter->second = false; 	// pointer will be made invalid because the user 
-								// deletes the handler by itself                          
-	}
-	_handlers.erase(&handler);
-}
-
-//
-// signalHandler(sig)
-//
-void GCFTask::signalHandler(int sig)
-{
-	if ((sig == SIGINT) || (sig == SIGTERM)) {
-		_doExit = true;
-	}
-}                                            
-
-  } // namespace TM
- } // namespace GCF
-} // namespace LOFAR
diff --git a/MAC/GCF/TM/src/Makefile.am b/MAC/GCF/TM/src/Makefile.am
index 513b4ee1701..70d01bf98af 100644
--- a/MAC/GCF/TM/src/Makefile.am
+++ b/MAC/GCF/TM/src/Makefile.am
@@ -17,9 +17,10 @@ DOCHDRS = \
 lib_LTLIBRARIES 	= libgcftm.la
 
 libgcftm_la_SOURCES= Package__Version.cc  $(DOCHDRS) \
+  GCF_Handler.cc \
+  GCF_Scheduler.cc \
   GCF_Fsm.cc \
   GCF_Protocols.cc \
-  GCF_Task.cc \
   Port/GCF_PortInterface.cc \
   Port/GCF_Port.cc \
   Port/GCF_RawPort.cc \
@@ -38,7 +39,7 @@ libgcftm_la_SOURCES= Package__Version.cc  $(DOCHDRS) \
   ServiceBroker/GTM_SBTCPPort.cc \
   ServiceBroker/ServiceBrokerTask.cc 
 
-libgcftm_la_CPPFLAGS=-I$(top_srcdir)/src/ServiceBroker
+libgcftm_la_CPPFLAGS=-I$(top_srcdir)/src/ServiceBroker 
 
 libgcftm_la_CXXFLAGS=-fmessage-length=0
 
diff --git a/MAC/GCF/TM/src/Port/GCF_PortInterface.cc b/MAC/GCF/TM/src/Port/GCF_PortInterface.cc
index 7e4a408548c..f81e217b8f2 100644
--- a/MAC/GCF/TM/src/Port/GCF_PortInterface.cc
+++ b/MAC/GCF/TM/src/Port/GCF_PortInterface.cc
@@ -110,6 +110,17 @@ string GCFPortInterface::makeServiceName() const
 	return(formatString("%s:%s", _pTask->getName().c_str(), _name.c_str()));
 }
 
+//
+// dispatch(e)
+//
+// NB: this function is added for the GCFScheduler.
+//
+GCFEvent::TResult   GCFPortInterface::dispatch  (GCFEvent& event)
+{ 
+	return (_pTask->doEvent(event, *this)); 
+}
+
+
   } // namespace TM
  } // namespace GCF
 } // namespace LOFAR
diff --git a/MAC/GCF/TM/src/Port/GCF_RawPort.cc b/MAC/GCF/TM/src/Port/GCF_RawPort.cc
index 8157592c0c3..1c44b43d4ac 100644
--- a/MAC/GCF/TM/src/Port/GCF_RawPort.cc
+++ b/MAC/GCF/TM/src/Port/GCF_RawPort.cc
@@ -36,11 +36,6 @@ namespace LOFAR {
  namespace GCF {
   namespace TM {
 
-// static framework events
-static GCFEvent disconnectedEvent(F_DISCONNECTED);
-static GCFEvent connectedEvent   (F_CONNECTED);
-static GCFEvent closedEvent      (F_CLOSED);
-
 //
 // GCFRawPort(task, name, type, protocol, raw)
 //
@@ -50,10 +45,14 @@ GCFRawPort::GCFRawPort(GCFTask& 	 task,
                        int 			 protocol,
                        bool 		 transportRawData) : 
     GCFPortInterface(&task, name, type, protocol, transportRawData),   
-    _pMaster(0)
+    _pMaster(0),
+	itsScheduler(0)
 {
 	_pTimerHandler = GTMTimerHandler::instance(); 
-	ASSERT(_pTimerHandler);
+	ASSERTSTR(_pTimerHandler, "Cannot reach the Timer handler");
+
+	itsScheduler = GCFScheduler::instance();
+	ASSERTSTR(itsScheduler, "Cannot reach the GCF scheduler");
 }
 
 //
@@ -64,7 +63,10 @@ GCFRawPort::GCFRawPort() :
     _pMaster(0)
 {
 	_pTimerHandler = GTMTimerHandler::instance(); 
-	ASSERT(_pTimerHandler);
+	ASSERTSTR(_pTimerHandler, "Cannot reach the Timer handler");
+
+	itsScheduler = GCFScheduler::instance();
+	ASSERTSTR(itsScheduler, "Cannot reach the GCF scheduler");
 }
 
 //
@@ -96,7 +98,6 @@ GCFRawPort::~GCFRawPort()
 //
 GCFEvent::TResult GCFRawPort::dispatch(GCFEvent& event)
 {
-	GCFEvent::TResult status = GCFEvent::NOT_HANDLED;
 	ASSERT(_pTask);
 
 	// Test whether the event is a framework event or not
@@ -105,7 +106,6 @@ GCFEvent::TResult GCFRawPort::dispatch(GCFEvent& event)
 						  (F_EVT_PROTOCOL(event) != F_PORT_PROTOCOL)) {
 		// Inform about the fact of an incomming message
 		LOG_DEBUG(formatString ("%s was received on port '%s' in task '%s'",
-//								_pTask->eventName(event).c_str(), 
 								eventName(event).c_str(), 
 								getRealName().c_str(), 
 								_pTask->getName().c_str())); 
@@ -126,16 +126,6 @@ GCFEvent::TResult GCFRawPort::dispatch(GCFEvent& event)
 		_state = S_DISCONNECTED;
 		break;
 
-	case F_TIMER: {
-		// result of the schedule_* methods
-		GCFTimerEvent* pTE = static_cast<GCFTimerEvent*>(&event);
-		if (&disconnectedEvent == pTE->arg || &connectedEvent == pTE->arg ||
-												&closedEvent == pTE->arg) {    
-			return dispatch(*((GCFEvent*) pTE->arg));
-		}
-		break;
-	}
-
 	case F_DATAIN: {
 		// the specific transport implementations informs the rawport about 
 		// incomming data
@@ -147,41 +137,15 @@ GCFEvent::TResult GCFRawPort::dispatch(GCFEvent& event)
 	}
 
 	default:
-	// 170507: This IN/OUT stuff is not very handy in the control-chains.
-	//		   It is also not neccesary to check this because signals will always
-	//		   be catched in switches. It is much more usefull to use these two bits
-	//		   for marking whether a message is an order/request or an acknowlegdement.
-	//		   For now these checks are disabled.
-#if 0
-		if (SPP == getType() && (F_EVT_INOUT(event) == F_OUT)) {    
-			LOG_ERROR(formatString ("Developer error in %s (port %s): "
-									"received an OUT event (%s) in a SPP",
-									_pTask->getName().c_str(), 
-									getRealName().c_str(), 
-									_pTask->eventName(event)));    
-		return (status);
-		}
-		else if (SAP == getType() && (F_EVT_INOUT(event) == F_IN)) {
-			LOG_ERROR(formatString ("Developer error in %s (port %s): "
-									"received an IN event (%s) in a SAP",
-									_pTask->getName().c_str(), 
-									getRealName().c_str(), 
-									_pTask->eventName(event)));    
-			return (status);
-		}
-#endif
 		break;
 	}
 
 	if (isSlave()) {
 		_pMaster->setState(_state);
-		status = _pTask->dispatch(event, *_pMaster);      
-	}
-	else {
-		status = _pTask->dispatch(event, *this);
+		return(_pTask->doEvent(event, *_pMaster));
 	}
 
-	return (status);
+	return(_pTask->doEvent(event, *this));
 }
 
 //
@@ -282,79 +246,54 @@ bool GCFRawPort::findAddr(TPeerAddr& addr)
 	return (true);
 }
 
-//
-// schedule_disconnect()
-//
-void GCFRawPort::schedule_disconnected()
-{
-  // forces a context switch
-  setTimer(0, 0, 0, 0, (void*)&disconnectedEvent);
-}
-
-//
-// schedule_close()
-//
-void GCFRawPort::schedule_close()
-{
-  // forces a context switch
-  setTimer(0, 0, 0, 0, (void*)&closedEvent);
-}
-
-//
-// schedule_connect()
-//
-void GCFRawPort::schedule_connected()
-{
-  // forces a context switch
-  setTimer(0, 0, 0, 0, (void*)&connectedEvent);
-}
-
 //
 // recvEvent()
 //
 GCFEvent::TResult GCFRawPort::recvEvent()
 {
-	GCFEvent::TResult status = GCFEvent::NOT_HANDLED;
+	bool		error (false);
+	GCFEvent	e;
+	char* 		event_buf(0);
+	GCFEvent*	full_event(&e);
 
-	GCFEvent e;
 	// expects and reads signal
 	if (recv(&e.signal, sizeof(e.signal)) != sizeof(e.signal)) {
+		error = true;
 		// don't continue with receiving
 	}
 	// expects and reads length
 	else if (recv(&e.length, sizeof(e.length)) != sizeof(e.length)) {
+		error = true;
 		// don't continue with receiving
 	}  
 	// reads payload if specified
 	else if (e.length > 0) {
-		GCFEvent* full_event = 0;
-		char* event_buf = new char[sizeof(e) + e.length];
-		full_event = (GCFEvent*)event_buf;
+		event_buf = new char[sizeof(e) + e.length];
 		memcpy(event_buf, &e, sizeof(e));
+		full_event = (GCFEvent*)event_buf;
 
 		// read the payload right behind the just memcopied basic event struct
-		if (recv(event_buf + sizeof(e), e.length) > 0) {          
-			// dispatchs an event with just received params
-			status = dispatch(*full_event);
+		if (recv(event_buf + sizeof(e), e.length) != e.length) {
+			error = true;
 		}    
-		delete [] event_buf;
-	}
-	// dispatchs an event without params
-	else {
-		status = dispatch(e);
 	}
 
-	if (status != GCFEvent::HANDLED) {
-		ASSERT(getTask());
-		LOG_DEBUG(formatString (
-			"'%s' for port '%s' in task '%s' not handled or an error occured",
-//			getTask()->eventName(e).c_str(), 
-			eventName(e).c_str(), 
-			getRealName().c_str(),
-			getTask()->getName().c_str()));
+	// receive errors?
+	if (error) {
+		LOG_ERROR_STR("Error during receiption of an event on port " << getRealName());
+		if (event_buf) {
+			delete [] event_buf;
+		}
+		return (GCFEvent::NOT_HANDLED);
 	}
 
-	return (status);
+	// dispatch the event to the task
+	itsScheduler->queueEvent(const_cast<GCFTask*>(getTask()), *full_event, this);
+
+	if (event_buf) {
+		delete [] event_buf;
+	}
+	return (GCFEvent::HANDLED);
 }
 
 //
diff --git a/MAC/GCF/TM/src/PortImpl/GCF_DevicePort.cc b/MAC/GCF/TM/src/PortImpl/GCF_DevicePort.cc
index dec6fb4964c..03296270f35 100644
--- a/MAC/GCF/TM/src/PortImpl/GCF_DevicePort.cc
+++ b/MAC/GCF/TM/src/PortImpl/GCF_DevicePort.cc
@@ -76,68 +76,47 @@ GCFDevicePort::~GCFDevicePort()
 
 bool GCFDevicePort::open()
 {
-  if (isConnected())
-  {
-    LOG_ERROR(formatString ( 
-        "Port %s already open.",
-	      getRealName().c_str()));
+  if (isConnected()) {
+    LOG_ERROR(formatString ( "Port %s already open.", getRealName().c_str()));
     return false;
   }
-  else if (SAP != getType())
-  {
-    LOG_ERROR(formatString ( 
-        "Device ports only can act as a SAP (%s).",
-        getRealName().c_str()));
+
+  if (SAP != getType()) {
+    LOG_ERROR(formatString ( "Device ports only can act as a SAP (%s).", getRealName().c_str()));
     return false;
   }
-  else if (!_pDevice)
-  {
-    if (isSlave())
-    {
-      LOG_ERROR(formatString ( 
-          "Port %s not initialised.",
-          getRealName().c_str()));
+  
+  if (!_pDevice) {
+    if (isSlave()) {
+      LOG_ERROR(formatString ( "Port %s not initialised.", getRealName().c_str()));
       return false;
     }
-    else
-    {
-      _pDevice = new GTMDevice(*this);
-    }
+    _pDevice = new GTMDevice(*this);
   }
 
-  try
-  {
-    if (!_devNameIsSet)
-    {
+  try {
+    if (!_devNameIsSet) {
       // retrieve the device name from the parameter set
       setDeviceName(
           globalParameterSet()->getString(
-              formatString(
-                  "mac.ns.%s.%s.deviceName",
-                  _pTask->getName().c_str(),
-                  getRealName().c_str())
+              formatString( "mac.ns.%s.%s.deviceName", _pTask->getName().c_str(), getRealName().c_str())
               )
           );    
     }
   }
-  catch (...)
-  {
-    if (!_devNameIsSet)
-    {
-      LOG_ERROR(formatString (
-          "Could not get address info for port '%s' of task '%s'",
+  catch (...) {
+    if (!_devNameIsSet) {
+      LOG_ERROR(formatString ( "Could not get address info for port '%s' of task '%s'",
           getRealName().c_str(), _pTask->getName().c_str()));
       return false;
     }
   }
 
-  if (_pDevice->open(_deviceName))
-  { 
+  if (_pDevice->open(_deviceName)) { 
     setState(S_CONNECTING);
     schedule_connected();
   }
-  else
-  {
+  else {
     setState(S_DISCONNECTING);
     schedule_disconnected();
   }
@@ -148,10 +127,8 @@ ssize_t GCFDevicePort::send(GCFEvent& e)
 {
   size_t written = 0;
   
-  if (!isConnected()) 
-  {
-    LOG_ERROR(formatString (
-        "Port '%s' on task '%s' not connected! Event not sent!",
+  if (!isConnected()) {
+    LOG_ERROR(formatString ( "Port '%s' on task '%s' not connected! Event not sent!",
         getRealName().c_str(),
         getTask()->getName().c_str()));
     return 0;
@@ -169,11 +146,8 @@ ssize_t GCFDevicePort::send(GCFEvent& e)
       getTask()->getName().c_str(), 
       getRealName().c_str()));
 
-  if ((written = _pDevice->send(buf, packsize)) != packsize)
-  {
-    LOG_DEBUG(formatString (
-        "truncated send: %s",
-        strerror(errno)));
+  if ((written = _pDevice->send(buf, packsize)) != packsize) {
+    LOG_DEBUG(formatString ( "truncated send: %s", strerror(errno)));
       
     setState(S_DISCONNECTING);    
     schedule_disconnected();
diff --git a/MAC/GCF/TM/src/PortImpl/GCF_ETHRawPort.cc b/MAC/GCF/TM/src/PortImpl/GCF_ETHRawPort.cc
index 13349ada7e2..1e489d0b158 100644
--- a/MAC/GCF/TM/src/PortImpl/GCF_ETHRawPort.cc
+++ b/MAC/GCF/TM/src/PortImpl/GCF_ETHRawPort.cc
@@ -66,8 +66,6 @@ GCFETHRawPort::~GCFETHRawPort()
 
 bool GCFETHRawPort::close()
 {
-  LOG_DEBUG("close -> schedule_close");
-
   setState(S_CLOSING);
   schedule_close();
 
diff --git a/MAC/GCF/TM/src/PortImpl/GCF_ITCPort.cc b/MAC/GCF/TM/src/PortImpl/GCF_ITCPort.cc
index 1801a1eb067..25d1a880619 100644
--- a/MAC/GCF/TM/src/PortImpl/GCF_ITCPort.cc
+++ b/MAC/GCF/TM/src/PortImpl/GCF_ITCPort.cc
@@ -149,7 +149,7 @@ GCFEvent::TResult GCFITCPort::dispatch(GCFEvent& event)
 
 				// client timer expired? dispatch to slave
 				if (clientIt != itsToSlaveTimerId.end()) {
-					status = itsSlaveTask.dispatch(*pActualEvent, *this);
+					status = itsSlaveTask.doEvent(*pActualEvent, *this);
 					// extra check to see if it still exists:
 					clientIt = itsToSlaveTimerId.find(timerEvent.id);
 					if (clientIt != itsToSlaveTimerId.end()) {
@@ -158,7 +158,7 @@ GCFEvent::TResult GCFITCPort::dispatch(GCFEvent& event)
 				}
 				// server timer expired? dispatch to server
 				else if (serverIt != itsToContainerTimerId.end()) {
-					status = _pTask->dispatch(*pActualEvent, *this);
+					status = _pTask->doEvent(*pActualEvent, *this);
 					// extra check to see if it still exists:
 					serverIt = itsToContainerTimerId.find(timerEvent.id);
 					if (serverIt != itsToContainerTimerId.end()) {
diff --git a/MAC/GCF/TM/src/PortImpl/GCF_TCPPort.cc b/MAC/GCF/TM/src/PortImpl/GCF_TCPPort.cc
index 1c25d3d7106..525314e6ddf 100644
--- a/MAC/GCF/TM/src/PortImpl/GCF_TCPPort.cc
+++ b/MAC/GCF/TM/src/PortImpl/GCF_TCPPort.cc
@@ -29,10 +29,10 @@
 #include <GCF/TM/GCF_Task.h>
 #include <GCF/TM/GCF_Protocols.h>
 #include <Common/ParameterSet.h>
-#include "GTM_TCPServerSocket.h"
+#include <Timer/GTM_TimerHandler.h>
 #include <ServiceBroker/ServiceBrokerTask.h>
-//#include <ServiceBroker/GSB_Defines.h>
 #include <GTM_Defines.h>
+#include "GTM_TCPServerSocket.h"
 #include <errno.h>
 
 namespace LOFAR {
@@ -50,13 +50,18 @@ GCFTCPPort::GCFTCPPort(GCFTask& 	 task,
                        int 			 protocol, 
                        bool 		 transportRawData) 
   : GCFRawPort(task, name, type, protocol, transportRawData),
-    _pSocket(0),
-    _addrIsSet(false),
-	_addr(),
-	_host(myHostname(false)),
-    _portNumber(0),
-	itsFixedPortNr(false),
-    _broker(0)
+    _pSocket		  (0),
+    _addrIsSet		  (false),
+	_addr			  (),
+	_host			  (myHostname(false)),
+    _portNumber		  (0),
+	itsFixedPortNr	  (false),
+	itsAutoOpen		  (false),
+	itsAutoOpenTimer  (0),
+	itsAutoRetryTimer (0),
+	itsAutoRetries	  (0),
+	itsAutoRetryItv	  (0.0),
+    _broker			  (0)
 {
 	if (SPP == getType() || MSPP == getType()) {
 		_pSocket = new GTMTCPServerSocket(*this, (MSPP == type));
@@ -71,13 +76,18 @@ GCFTCPPort::GCFTCPPort(GCFTask& 	 task,
 //
 GCFTCPPort::GCFTCPPort()
     : GCFRawPort(),
-    _pSocket(0),
-    _addrIsSet(false),
-	_addr(),
-	_host(myHostname(false)),
-    _portNumber(0),
-	itsFixedPortNr(false),
-    _broker(0)
+    _pSocket		  (0),
+    _addrIsSet		  (false),
+	_addr			  (),
+	_host			  (myHostname(false)),
+    _portNumber		  (0),
+	itsFixedPortNr	  (false),
+	itsAutoOpen		  (false),
+	itsAutoOpenTimer  (0),
+	itsAutoRetryTimer (0),
+	itsAutoRetries	  (0),
+	itsAutoRetryItv	  (0.0),
+    _broker			  (0)
 {
 }
 
@@ -120,9 +130,10 @@ void GCFTCPPort::init(GCFTask& 		task,
 }
 
 //
-// try to open the socket
-// Remember that this routine may be called many times before a socket is
-// really open.
+// Try to open the socket
+// Remember that this routine may be called many times before a socket is realy open.
+//
+// NOTE: the return state reflects whether or not an answer is already send to the caller.
 //
 bool GCFTCPPort::open()
 {
@@ -155,7 +166,7 @@ bool GCFTCPPort::open()
 		if (_portNumber != 0) {					// dest. overruled by user?
 												// or answer already received before
 			// Try to 'open' en 'connect' to port
-			serviceInfo(SB_NO_ERROR, _portNumber, _host);
+			serviceInfo(SB_NO_ERROR, _portNumber, _host);		// sends a F_CONNECTED
 			return (true);
 		}
 
@@ -190,29 +201,127 @@ bool GCFTCPPort::open()
 		ASSERT(_broker);
 		_broker->getServiceinfo(*this, remoteServiceName, _host);
 		// a (dis)connect event will be scheduled
-		return (true);
+		return (false);	// REO: changed that
 	}
 
 	// porttype = MSPP or SPP
 	// portnumber overruled by user? try mac.ns.<taskname>.<realname>.port
-	string portNumParam = formatString(PARAM_TCP_PORTNR, 
-						getTask()->getName().c_str(), getRealName().c_str());
+	string portNumParam = formatString(PARAM_TCP_PORTNR, getTask()->getName().c_str(), getRealName().c_str());
 	if (globalParameterSet()->isDefined(portNumParam)) {
 		_portNumber = globalParameterSet()->getInt32(portNumParam);
 	}
 	if (_portNumber > 0) {					// portnumber hard set by user.
 		serviceRegistered(SB_NO_ERROR, _portNumber);	// 'hard' open port
-		// a (dis)connect event will be scheduled
-		// Note: service is NOT registered at service broker!!!
+		return (true);
 	}
-	else {	// portnumber not overruled by user so ask SB for a portnumber
-		_broker = ServiceBrokerTask::instance();
-		ASSERT(_broker);
-		_broker->registerService(*this);
-		// a (dis)connect event will be scheduled
+
+	// portnumber not overruled by user so ask SB for a portnumber
+	_broker = ServiceBrokerTask::instance();
+	ASSERT(_broker);
+	_broker->registerService(*this); // a (dis)connect event will be scheduled
+	return (false);	// REO changed that
+}
+
+//
+// autoOpen(nrRetries, timeout, reconnectInterval)
+//	Will generate a F_CONNECTED or F_DISCONNECTED event.
+//
+void GCFTCPPort::autoOpen(uint	nrRetries, double	timeout, double	reconnectInterval)
+{
+	itsAutoOpen = true;
+
+	if (open()) {							// first try to open it
+		return;
+	}
+
+	// It is not open yet. But the call to open() activated the ServiceBroker task to do it job.
+	// All we have to do is copy the user settings, (start a timer) and wait.
+
+	itsAutoOpenTimer  = 0;
+	itsAutoRetryTimer = 0;
+	itsAutoRetries    = nrRetries;
+	itsAutoRetryItv   = reconnectInterval;
+	if (timeout > 0.0) {		// absolute max auto-open time specified? Set timer for doomsday.
+		itsAutoOpenTimer = _pTimerHandler->setTimer(*this, (uint64)(1000000.0*timeout), 0, &itsAutoOpenTimer);
+		if (itsAutoRetries == 0) {
+			itsAutoRetries = -1;		// to let the timeout timer running
+		}
+	}
+}
+
+//
+// _handleDisconnect()
+//
+void GCFTCPPort::_handleDisconnect()
+{
+	LOG_TRACE_COND_STR("_handleDisco:autoOpen=" << (itsAutoOpen ? "Yes" : "No") << ", nrRetries=" << itsAutoRetries << ", retryTimer=" << itsAutoRetryTimer << ", maxTimer=" << itsAutoOpenTimer);
+
+	// retries left?
+	if (itsAutoOpen) {
+		if (itsAutoRetries != 0) {
+			itsAutoRetryTimer = _pTimerHandler->setTimer(*this, (uint64)(1000000.0*itsAutoRetryItv), 0, &itsAutoRetryTimer);
+			return;
+		}
+	}
+
+	// stop auto timer
+	if (itsAutoOpenTimer) {
+		_pTimerHandler->cancelTimer(itsAutoOpenTimer);
+		itsAutoOpenTimer = 0;
+	}
+	if (itsAutoRetryTimer) {
+		_pTimerHandler->cancelTimer(itsAutoRetryTimer);
+		itsAutoRetryTimer = 0;
+	}
+
+	// inform user
+	schedule_disconnected();
+}
+
+//
+// _handleConnect()
+//
+void GCFTCPPort::_handleConnect()
+{
+	// stop auto timer
+	if (itsAutoOpenTimer) {
+		_pTimerHandler->cancelTimer(itsAutoOpenTimer);
+		itsAutoOpenTimer = 0;
+	}
+	if (itsAutoRetryTimer) {
+		_pTimerHandler->cancelTimer(itsAutoRetryTimer);
+		itsAutoRetryTimer = 0;
+	}
+	itsAutoOpen = false;
+
+	// inform user
+	schedule_connected();
+}
+
+//
+// dispatch(event)
+//
+GCFEvent::TResult	GCFTCPPort::dispatch(GCFEvent&	event)
+{
+	if (event.signal == F_TIMER) {
+		GCFTimerEvent	*TEptr = static_cast<GCFTimerEvent*>(&event);
+		if (TEptr->arg == &itsAutoOpenTimer) {	// Max auto open time reached?
+			itsAutoRetries   = 0;
+			itsAutoOpenTimer = 0;
+			_handleDisconnect();
+			return (GCFEvent::HANDLED);
+		}
+		if (TEptr->arg == &itsAutoRetryTimer) {
+			if (itsAutoRetries > 0) {		// don't lower counter when it is set by the maxTimer
+				itsAutoRetries--;
+			}
+			itsAutoRetryTimer = 0;
+			open();
+			return (GCFEvent::HANDLED);
+		}
 	}
 
-	return (true);
+	return(GCFRawPort::dispatch(event));	// call dispatch from parent (RawPort).
 }
 
 
@@ -226,22 +335,20 @@ void GCFTCPPort::serviceRegistered(unsigned int result, unsigned int portNumber)
 {
 	ASSERT(MSPP == getType() || SPP == getType());
 	if (result != SB_NO_ERROR) {
-		schedule_disconnected();
+		_handleDisconnect();
 		return;
 	}
 
-	LOG_DEBUG(formatString (
-				"(M)SPP port '%s' in task '%s' listens on portnumber %d.",
-				getRealName().c_str(), _pTask->getName().c_str(),
-				portNumber));
+	LOG_DEBUG(formatString ( "(M)SPP port '%s' in task '%s' listens on portnumber %d.",
+				getRealName().c_str(), _pTask->getName().c_str(), portNumber));
 	_portNumber = portNumber;
 	if (!_pSocket->open(portNumber)) {
-		schedule_disconnected();
+		_handleDisconnect();
 		return;
 	}
 
 	if (getType() == MSPP) {
-		schedule_connected();
+		_handleConnect();
 	}
 }
 
@@ -262,7 +369,7 @@ void GCFTCPPort::serviceInfo(unsigned int result, unsigned int portNumber, const
 								makeServiceName().c_str(),
 								_addr.taskname.c_str(), _addr.portname.c_str()));
 
-		schedule_disconnected();
+		_handleDisconnect();
 		return;
 	}
 
@@ -276,12 +383,13 @@ void GCFTCPPort::serviceInfo(unsigned int result, unsigned int portNumber, const
 								_addr.taskname.c_str(), _addr.portname.c_str(),
 								host.c_str(), portNumber));
 
+		// Note: _pSocket is of type GTMTCPSocket
 		if (_pSocket->open(portNumber) && _pSocket->connect(portNumber, host)) {
-			schedule_connected();
+			_handleConnect();
 			return;
 		}
 
-		schedule_disconnected();
+		_handleDisconnect();
 	}
 }
 
@@ -317,14 +425,13 @@ ssize_t GCFTCPPort::send(GCFEvent& e)
 
 	LOG_TRACE_STAT(formatString (
 						"Sending event '%s' for task '%s' on port '%s'",
-//						getTask()->eventName(e).c_str(), 
 						eventName(e).c_str(), 
 						getTask()->getName().c_str(), 
 						getRealName().c_str()));
 
 	if ((written = _pSocket->send(buf, packsize)) != (ssize_t) packsize) {  
 		setState(S_DISCONNECTING);     
-		schedule_disconnected();
+		_handleDisconnect();
 
 		written = 0;
 	}
@@ -347,10 +454,10 @@ ssize_t GCFTCPPort::recv(void* buf, size_t count)
 		return 0;
 	}
 
-	ssize_t	btsRead = _pSocket->recv(buf, count);
+	ssize_t	btsRead = _pSocket->recv(buf, count, isTransportRawData());
 	if (btsRead == 0) {
 		setState(S_DISCONNECTING);     
-		schedule_disconnected();
+		_handleDisconnect();
 	}
 
 	return (btsRead);
@@ -419,7 +526,7 @@ bool GCFTCPPort::accept(GCFTCPPort& port)
 
 	if (pProvider->accept(*port._pSocket)) {
 		setState(S_CONNECTING);        
-		port.schedule_connected();
+		port.schedule_connected();		// NO _handleConnect()  !!!!
 		result = true;
 	}
 	return result;
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_Device.cc b/MAC/GCF/TM/src/PortImpl/GTM_Device.cc
index d164bf03c31..e46194dac10 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_Device.cc
+++ b/MAC/GCF/TM/src/PortImpl/GTM_Device.cc
@@ -60,7 +60,7 @@ ssize_t GTMDevice::send(void* buf, size_t count)
     return 0;
 }
 
-ssize_t GTMDevice::recv(void* buf, size_t count)
+ssize_t GTMDevice::recv(void* buf, size_t count, bool /*raw*/)
 {
   if (_fd > -1) 
     return ::read(_fd, buf, count);
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_Device.h b/MAC/GCF/TM/src/PortImpl/GTM_Device.h
index 1b8df67b346..f95f3051cd1 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_Device.h
+++ b/MAC/GCF/TM/src/PortImpl/GTM_Device.h
@@ -57,7 +57,7 @@ class GTMDevice : public GTMFile
      * send/recv methods
      */
     virtual ssize_t send (void* buf, size_t count);
-    virtual ssize_t recv (void* buf, size_t count);
+    virtual ssize_t recv (void* buf, size_t count, bool raw = false);
 
   private:
     /// default contructor
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.cc b/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.cc
index 2de9cfb251f..8a74fff2062 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.cc
+++ b/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.cc
@@ -101,7 +101,7 @@ ssize_t GTMETHSocket::send(void* buf, size_t count)
 /**
  * recv a maximum of count bytes, return actually returned bytes
  */
-ssize_t GTMETHSocket::recv(void* buf, size_t count)
+ssize_t GTMETHSocket::recv(void* buf, size_t count, bool /*raw*/)
 {
   ssize_t received = -1;
 
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.h b/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.h
index 414dbec1640..5244ef2027c 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.h
+++ b/MAC/GCF/TM/src/PortImpl/GTM_ETHSocket.h
@@ -62,7 +62,7 @@ class GTMETHSocket : public GTMFile
      * send/recv methods
      */
     virtual ssize_t send (void* buf, size_t count);
-    virtual ssize_t recv (void* buf, size_t count);
+    virtual ssize_t recv (void* buf, size_t count, bool raw = false);
 
   private:
     GTMETHSocket ();
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_File.cc b/MAC/GCF/TM/src/PortImpl/GTM_File.cc
index aab656c9f2b..a57853b1352 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_File.cc
+++ b/MAC/GCF/TM/src/PortImpl/GTM_File.cc
@@ -28,100 +28,101 @@
 #include "GTM_FileHandler.h"
 #include <GCF/TM/GCF_RawPort.h>
 #include <GCF/TM/GCF_Task.h>
-#include <GTM_Defines.h>
+#include <GCF/TM/GCF_Scheduler.h>
+//#include <GTM_Defines.h>
 #include <GCF/TM/GCF_Protocols.h>
 #include <stdio.h>
 #include <sys/ioctl.h>
 #include <errno.h>
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace TM 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
 
 GTMFile::GTMFile(GCFRawPort& port) :
-  _fd(-1),
-  _pHandler(0),
-  _port(port)
+	_fd(-1),
+	_pHandler(0),
+	_port(port)
 {
-  _pHandler = GTMFileHandler::instance();
-  ASSERT(_pHandler);
+	_pHandler = GTMFileHandler::instance();
+	ASSERT(_pHandler);
+	itsScheduler = GCFScheduler::instance();
+	ASSERT(itsScheduler);
 }
 
 GTMFile::~GTMFile()
 {
-  close();
-  GTMFileHandler::release();
-  _pHandler = 0;
+	close();
+	GTMFileHandler::release();
+	_pHandler = 0;
+	itsScheduler = 0;
 }
 
 bool GTMFile::close()
 {
-  bool result(true);
-  
-  if (_fd > -1)
-  { 
-    ASSERT(_pHandler);
-    _pHandler->deregisterFile(*this);
-    result = (::close(_fd) == 0);
-    if (!result)
-    {
-      LOG_WARN(formatString (
-              "::close, error: %s",
-              strerror(errno)));
-      close();
-    }
-    
-    _fd = -1;
-  }
-  return result;
+	bool result(true);
+
+	if (_fd > -1) { 
+		ASSERT(_pHandler);
+		_pHandler->deregisterFile(*this);
+		result = (::close(_fd) == 0);
+		if (!result) {
+			LOG_WARN(formatString ( "::close, error: %s", strerror(errno)));
+			close();
+		}
+
+		_fd = -1;
+	}
+	return result;
 }
 
 int GTMFile::setFD(int fd)
 {
-  if (fd >= 0)
-  {
-    if (_fd > -1)
-    {
-      close();
-    }
-    _fd = fd;
-    ASSERT(_pHandler);
-    _pHandler->registerFile(*this);
-  }
-  return (fd);    
+	if (fd >= 0) {
+		if (_fd > -1) {
+			close();
+		}
+		_fd = fd;
+		ASSERT(_pHandler);
+		_pHandler->registerFile(*this);
+	}
+	return (fd);    
+}
+
+void GTMFile::doWork()
+{
+	unsigned long bytesRead = 0;
+
+	if (ioctl(_fd, FIONREAD, &bytesRead) > -1) {
+		if (bytesRead == 0) {
+			GCFEvent discoEvent(F_DISCONNECTED);
+			itsScheduler->queueEvent(0, discoEvent, &_port);
+//			_port.dispatch(e);    
+		}
+		else {
+			GCFEvent dataEvent(F_DATAIN);
+			itsScheduler->queueEvent(0, dataEvent, &_port);
+//			_port.dispatch(e);
+		}
+	}
+	else {
+		ASSERT(_port.getTask());
+			LOG_FATAL(LOFAR::formatString ("%s(%s): Error in 'ioctl' on socket fd %d: %s",
+						_port.getTask()->getName().c_str(), 
+						_port.getName().c_str(), 
+						_fd, 
+						strerror(errno)));        
+	}
 }
 
-void GTMFile::workProc()
+//
+// forwardEvent(event)
+//
+void GTMFile::forwardEvent (LOFAR::MACIO::GCFEvent& event) 
 {
-  unsigned long bytesRead = 0;
-  
-  if (ioctl(_fd, FIONREAD, &bytesRead) > -1)
-  {
-    if (bytesRead == 0)
-    {
-      GCFEvent e(F_DISCONNECTED);
-      _port.dispatch(e);    
-    }
-    else 
-    {
-      GCFEvent e(F_DATAIN);
-      _port.dispatch(e);
-    }
-  }
-  else
-  {
-    ASSERT(_port.getTask());
-    LOG_FATAL(LOFAR::formatString (
-        "%s(%s): Error in 'ioctl' on socket fd %d: %s",
-        _port.getTask()->getName().c_str(), 
-        _port.getName().c_str(), 
-        _fd, 
-        strerror(errno)));        
-  }
+	itsScheduler->queueEvent(0, event, &_port);
 }
-  } // namespace TM
- } // namespace GCF
+
+    } // namespace TM
+  } // namespace GCF
 } // namespace LOFAR
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_File.h b/MAC/GCF/TM/src/PortImpl/GTM_File.h
index e45f820c347..ca85e200a75 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_File.h
+++ b/MAC/GCF/TM/src/PortImpl/GTM_File.h
@@ -34,6 +34,7 @@ namespace LOFAR {
 // forward declaration
 class GTMFileHandler;
 class GCFRawPort;
+class GCFScheduler;
 
 /**
  * This class consists of the basic implementation of a "file/device". 
@@ -60,34 +61,28 @@ class GTMFile
      * send/recv methods
      */
     virtual ssize_t send (void* buf, size_t count) = 0;
-    virtual ssize_t recv (void* buf, size_t count) = 0;
+    virtual ssize_t recv (void* buf, size_t count, bool raw = false) = 0;
 
     int getFD () const {return _fd;}
     virtual int setFD (int fd);
-    virtual void workProc ();
+    virtual void doWork ();
     
   protected: // helper methods
-    GCFEvent::TResult   dispatch (GCFEvent& event);
+    void forwardEvent (GCFEvent& event);
         
   protected: // data members
     /// filedescriptor
-    int               _fd;
+    int					_fd;
     /// selects on all registered filedescriptors
-    GTMFileHandler*   _pHandler; 
+    GTMFileHandler*		_pHandler; 
     /// related port
-    GCFRawPort&       _port;    
+    GCFRawPort&			_port;    
+	// Pointer to the scheduler.
+	GCFScheduler*		itsScheduler;
 };
 
   } // namespace TM
  } // namespace GCF
 } // namespace LOFAR
 
-#include <GCF/TM/GCF_RawPort.h>
-
-using namespace LOFAR::GCF::TM;
-
-inline LOFAR::MACIO::GCFEvent::TResult GTMFile::dispatch (LOFAR::MACIO::GCFEvent& event) 
-{
-  return _port.dispatch(event);
-}
 #endif
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_FileHandler.cc b/MAC/GCF/TM/src/PortImpl/GTM_FileHandler.cc
index b4482df6fbf..008242b1bf4 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_FileHandler.cc
+++ b/MAC/GCF/TM/src/PortImpl/GTM_FileHandler.cc
@@ -27,94 +27,91 @@
 #include "GTM_File.h"
 #include <GCF/TM/GCF_Task.h>
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace TM 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
 GTMFileHandler* GTMFileHandler::_pInstance = 0;
 
 GTMFileHandler* GTMFileHandler::instance()
 {
-  if (0 == _pInstance)
-  {
-    _pInstance = new GTMFileHandler();
-    ASSERT(!_pInstance->mayDeleted());
-  }
-  _pInstance->use();
-  return _pInstance;
+	if (0 == _pInstance) {
+		_pInstance = new GTMFileHandler();
+		ASSERT(!_pInstance->mayDeleted());
+	}
+	_pInstance->use();
+
+	return _pInstance;
 }
 
 void GTMFileHandler::release()
 {
-  ASSERT(_pInstance);
-  ASSERT(!_pInstance->mayDeleted());
-  _pInstance->leave(); 
-  if (_pInstance->mayDeleted())
-  {
-    delete _pInstance;
-    ASSERT(!_pInstance);
-  }
+	ASSERT(_pInstance);
+	ASSERT(!_pInstance->mayDeleted());
+	_pInstance->leave(); 
+	if (_pInstance->mayDeleted()) {
+		delete _pInstance;
+		ASSERT(!_pInstance);
+	}
 }
 
-GTMFileHandler::GTMFileHandler() : _running(true)
+GTMFileHandler::GTMFileHandler() : 
+	_running(true)
 {
-  FD_ZERO(&_readFDs);
+	FD_ZERO(&_readFDs);
 }
 
 void GTMFileHandler::registerFile(GTMFile& file)
 {
-  FD_SET(file.getFD(), &_readFDs);
-  _files[file.getFD()] = &file;
+	LOG_TRACE_OBJ_STR("Adding filedescriptor " << file.getFD());
+	FD_SET(file.getFD(), &_readFDs);
+	_files[file.getFD()] = &file;
 }
 
 void GTMFileHandler::deregisterFile(GTMFile& file)
 {
-  FD_CLR(file.getFD(), &_readFDs);
-  _files.erase(file.getFD());  
+	LOG_TRACE_OBJ_STR("Removing filedescriptor " << file.getFD());
+	FD_CLR(file.getFD(), &_readFDs);
+	_files.erase(file.getFD());  
 }
 
 void GTMFileHandler::workProc()
 {
-  int result;
-  int fd;
-  TFiles testFiles;
+	int				result;
+	int				fd;
+	TFiles 			testFiles;
+	struct timeval	select_timeout;
 
-  struct timeval select_timeout;
+	//
+	// because select call changes the timeout value to
+	// contain the remaining time we need to set it to 10ms
+	// on every call to workProc
+	// 
+	select_timeout.tv_sec  = 0;
+	select_timeout.tv_usec = 10000;
 
-  //
-  // because select call changes the timeout value to
-  // contain the remaining time we need to set it to 10ms
-  // on every call to workProc
-  // 
-  select_timeout.tv_sec  = 0;
-  select_timeout.tv_usec = 10000;
-    
-  _running = true;
-  fd_set testFDs;
-  testFDs = _readFDs;
-  testFiles.insert(_files.begin(), _files.end());
-  result = ::select(FD_SETSIZE, &testFDs, (fd_set *) 0, (fd_set *) 0, &select_timeout);
+	_running = true;
+	fd_set testFDs;
+	testFDs = _readFDs;
+	testFiles.insert(_files.begin(), _files.end());
+	result = ::select(FD_SETSIZE, &testFDs, (fd_set *) 0, (fd_set *) 0, &select_timeout);
+	if (_files.empty()) {
+		return;
+	}
 
-  if (_files.empty()) return;
-  
-  if (result >= 0)
-  {
-    for (fd = 0; fd < FD_SETSIZE && _running; fd++)
-    {
-      if (FD_ISSET(fd, &testFDs))
-      {
-        testFiles[fd]->workProc();
-      }
-    }
-  }
+	if (result >= 0) {
+		for (fd = 0; fd < FD_SETSIZE && _running; fd++) {
+			if (FD_ISSET(fd, &testFDs)) {
+				testFiles[fd]->doWork();
+			}
+		}
+	}
 }
 
 void GTMFileHandler::stop()
 {
-  _running = false;
+	_running = false;
 }
+
   } // namespace TM
  } // namespace GCF
 } // namespace LOFAR
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_FileHandler.h b/MAC/GCF/TM/src/PortImpl/GTM_FileHandler.h
index 9e8eacff855..130c3c9401f 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_FileHandler.h
+++ b/MAC/GCF/TM/src/PortImpl/GTM_FileHandler.h
@@ -43,27 +43,30 @@ class GTMFile;
  */
 class GTMFileHandler : public GCFHandler
 {
-  public: // constructors, destructors and default operators
+public: 
+	// constructors, destructors and default operators
     virtual ~GTMFileHandler () { _pInstance = 0;}
-  
-  private:
-    friend class GTMFile; // is not necessary but suppress a warning, which we can accept
-    GTMFileHandler ();
-    /// Don't allow copying of the GTMTimerHandler object.
-    GTMFileHandler (const GTMFileHandler&);
-    GTMFileHandler& operator= (const GTMFileHandler&);
 
-  public: // GTMFileHandler specific member methods
+	// GTMFileHandler specific member methods
     /// singleton pattern methods
     static GTMFileHandler* instance ();
     static void release ();
 
     void workProc (); /// part of the mainloop
     void stop ();
-    void registerFile (GTMFile& timer);
-    void deregisterFile (GTMFile& timer); 
+    void registerFile (GTMFile& file);
+    void deregisterFile (GTMFile& file); 
+
+  
+private:
+    friend class GTMFile; // is not necessary but suppress a warning, which we can accept
+
+    GTMFileHandler ();
+    /// Don't allow copying of the GTMTimerHandler object.
+    GTMFileHandler (const GTMFileHandler&);
+    GTMFileHandler& operator= (const GTMFileHandler&);
 
-  private:
+	// ----- Data Members -----
     static GTMFileHandler* _pInstance; // singleton pointer
 
     /// all registered "files"
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_TCPServerSocket.cc b/MAC/GCF/TM/src/PortImpl/GTM_TCPServerSocket.cc
index 894741572d9..4dad7878664 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_TCPServerSocket.cc
+++ b/MAC/GCF/TM/src/PortImpl/GTM_TCPServerSocket.cc
@@ -40,15 +40,15 @@ namespace LOFAR {
   namespace TM {
     
 GTMTCPServerSocket::GTMTCPServerSocket(GCFTCPPort& port, bool isProvider) : 
-  GTMTCPSocket(port),
-  _isProvider(isProvider),
-  _pDataSocket(0)
+	GTMTCPSocket(port),
+	_isProvider(isProvider),
+	_pDataSocket(0)
 {
 }
 
 GTMTCPServerSocket::~GTMTCPServerSocket()
 {
-  close();  
+	close();  
 }
 
 bool GTMTCPServerSocket::open(unsigned int portNumber)
@@ -110,102 +110,112 @@ bool GTMTCPServerSocket::open(unsigned int portNumber)
 	return (true);
 }
 
-void GTMTCPServerSocket::workProc()
+//
+// doWork()
+//
+// Called by the GTM_FileHandler when 'select' returned an event on this fd.
+//
+void GTMTCPServerSocket::doWork()
 {
-  if (_isProvider) {
-    GCFEvent acceptReqEvent(F_ACCEPT_REQ);
-    dispatch(acceptReqEvent);
-  }
-  else {
-    GCFTCPPort* pPort = (GCFTCPPort*)(&_port);
-
-    ASSERT(_pDataSocket == 0);
-    _pDataSocket = new GTMTCPSocket(*pPort);
-    ASSERT (_pDataSocket->getFD() < 0);
-
-    struct sockaddr_in clientAddress;
-    socklen_t clAddrLen = sizeof(clientAddress);
-    int newSocketFD;
-
-    /* loop to handle transient errors */
-    int retries = MAX_ACCEPT_RETRIES;
-    while ((newSocketFD = ::accept(_fd, 
-			   (struct sockaddr*) &clientAddress,
-				   &clAddrLen)) < 0
-	   && (EINTR == errno || EWOULDBLOCK == errno || EAGAIN == errno)
-	   && --retries > 0) /*noop*/;
-
-    _pDataSocket->setFD(newSocketFD);
-         
-    if (_pDataSocket->getFD() >= 0) {
-      GCFEvent connectedEvent(F_CONNECTED);
-      dispatch(connectedEvent);
-    }
-    else {
-      LOG_WARN(formatString ( "::accept, error: %s", strerror(errno)));
-    }
-    
-    // because we only accept one connection (SPP), we don't need to listen with
-    // this socket anymore
-    GTMFile::close();
-  }
+	LOG_TRACE_FLOW("GTMTCPServerSocket::doWork()");
+
+	if (_isProvider) {
+		GCFEvent acceptReqEvent(F_ACCEPT_REQ);
+		forwardEvent(acceptReqEvent);
+	}
+	else {
+		GCFTCPPort* pPort = (GCFTCPPort*)(&_port);
+
+		ASSERT(_pDataSocket == 0);
+		_pDataSocket = new GTMTCPSocket(*pPort);
+		ASSERT (_pDataSocket->getFD() < 0);
+
+		struct sockaddr_in clientAddress;
+		socklen_t clAddrLen = sizeof(clientAddress);
+		int newSocketFD;
+
+		/* loop to handle transient errors */
+		int retries = MAX_ACCEPT_RETRIES;
+		while ((newSocketFD = ::accept(_fd, (struct sockaddr*) &clientAddress, &clAddrLen)) < 0
+			&& (EINTR == errno || EWOULDBLOCK == errno || EAGAIN == errno) && --retries > 0) 
+			/*noop*/;
+
+		_pDataSocket->setFD(newSocketFD);
+
+		if (_pDataSocket->getFD() >= 0) {
+			GCFEvent connectedEvent(F_CONNECTED);
+			forwardEvent(connectedEvent);
+		}
+		else {
+			LOG_WARN(formatString ( "::accept, error: %s", strerror(errno)));
+		}
+
+		// because we only accept one connection (SPP), we don't need to listen with
+		// this socket anymore
+		GTMFile::close();
+	}
 }
 
+//
+// accept(newsocket)
+//
+// Called by the usercode after getting an F_ACCEPT_REQ
+//
 bool GTMTCPServerSocket::accept(GTMFile& newSocket)
 {
-  bool result(false);
-  if (_isProvider && _pDataSocket == 0) {
-    struct sockaddr_in clientAddress;
-    socklen_t clAddrLen = sizeof(clientAddress);
-    int newSocketFD;
-
-    /* loop to handle transient errors */
-    int retries = MAX_ACCEPT_RETRIES;
-    while ((newSocketFD = ::accept(_fd, 
-                       (struct sockaddr*) &clientAddress, 
-				   &clAddrLen)) < 0
-	   && (EINTR == errno || EWOULDBLOCK == errno || EAGAIN == errno)
-	   && --retries > 0) /*noop*/;
-    
-    result = (newSocket.setFD(newSocketFD) > 0);
-    if (!result) {
-      LOG_WARN(formatString ("::accept, error: %s", strerror(errno)));
-    }
-  }
-  
-  return result;
+	bool result(false);
+	if (_isProvider && _pDataSocket == 0) {
+		struct sockaddr_in clientAddress;
+		socklen_t clAddrLen = sizeof(clientAddress);
+		int newSocketFD;
+
+		/* loop to handle transient errors */
+		int retries = MAX_ACCEPT_RETRIES;
+		while ((newSocketFD = ::accept(_fd, (struct sockaddr*) &clientAddress, &clAddrLen)) < 0
+			&& (EINTR == errno || EWOULDBLOCK == errno || EAGAIN == errno) && --retries > 0) 
+			/*noop*/;
+
+		result = (newSocket.setFD(newSocketFD) > 0);
+		if (!result) {
+			LOG_WARN(formatString ("::accept, error: %s", strerror(errno)));
+		}
+	}
+
+	return result;
 }
 
 bool GTMTCPServerSocket::close()
 {
-  bool result(true);
-  
-  if (!_isProvider && _pDataSocket != 0) {
-    result = _pDataSocket->close();
-    delete _pDataSocket;
-    _pDataSocket = 0;
-  }
-  if (result)
-    result = GTMFile::close();
-    
-  return result;
+	bool result(true);
+
+	if (!_isProvider && _pDataSocket != 0) {
+		result = _pDataSocket->close();
+		delete _pDataSocket;
+		_pDataSocket = 0;
+	}
+	if (result) {
+		result = GTMFile::close();
+	}
+
+	return result;
 }
 
 ssize_t GTMTCPServerSocket::send(void* buf, size_t count)
 {
-  if (!_isProvider && _pDataSocket != 0) 
-    return _pDataSocket->send(buf, count);
-  else
-    return 0;
+	if (!_isProvider && _pDataSocket != 0) {
+		return _pDataSocket->send(buf, count);
+	}
+	return 0;
 }
 
-ssize_t GTMTCPServerSocket::recv(void* buf, size_t count)
+ssize_t GTMTCPServerSocket::recv(void* buf, size_t count, bool  raw)
 {
-  if (!_isProvider && _pDataSocket != 0) 
-    return _pDataSocket->recv(buf, count);
-  else
-    return 0;
+	if (!_isProvider && _pDataSocket != 0) {
+		return _pDataSocket->recv(buf, count, raw);
+	}
+	return 0;
 }
+
   } // namespace TM
  } // namespace GCF
 } // namespace LOFAR
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_TCPServerSocket.h b/MAC/GCF/TM/src/PortImpl/GTM_TCPServerSocket.h
index 58db668299a..fc3f1c05709 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_TCPServerSocket.h
+++ b/MAC/GCF/TM/src/PortImpl/GTM_TCPServerSocket.h
@@ -25,12 +25,9 @@
 
 #include "GTM_TCPSocket.h"
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace TM 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
 
 // forward declaration
 
@@ -42,37 +39,33 @@ namespace LOFAR
  */
 class GTMTCPServerSocket : public GTMTCPSocket
 {
-  public: // constructors, destructors and default operators
+public: 
+	// constructors, destructors and default operators
     GTMTCPServerSocket (GCFTCPPort& port, 
                         bool isProvider = false);
-  
     virtual ~GTMTCPServerSocket ();
   
-  private:
-    GTMTCPServerSocket();
-    /// Don't allow copying of the GTMTCPServerSocket object.
-    GTMTCPServerSocket (const GTMTCPServerSocket&);
-    GTMTCPServerSocket& operator= (const GTMTCPServerSocket&);
-
-  public: // GTMTCPServerSocket specific member methods
-    /**
-     * open/close methods
-     */
+	// GTMTCPServerSocket specific member methods
+    // open/close methods
     virtual bool open (unsigned int portNumber);
     virtual bool close ();
     bool accept (GTMFile& newSocket);
     
-    /**
-     * send/recv methods
-     */
+    // send/recv methods
     virtual ssize_t send (void* buf, size_t count);
-    virtual ssize_t recv (void* buf, size_t count);
+    virtual ssize_t recv (void* buf, size_t count, bool raw = false);
+
+private:
+    GTMTCPServerSocket();
+    /// Don't allow copying of the GTMTCPServerSocket object.
+    GTMTCPServerSocket (const GTMTCPServerSocket&);
+    GTMTCPServerSocket& operator= (const GTMTCPServerSocket&);
 
-  protected:
-    virtual void workProc ();
+protected:
+    virtual void doWork();
     
-    bool _isProvider;
-    GTMTCPSocket* _pDataSocket;
+    bool 			_isProvider;
+    GTMTCPSocket*	_pDataSocket;
 };
 
   } // namespace TM
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.cc b/MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.cc
index bb928b4537c..af1df88f427 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.cc
+++ b/MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.cc
@@ -84,9 +84,9 @@ ssize_t GTMTCPSocket::send(void* buf, size_t count)
 }
 
 //
-// recv(buf, count)
+// recv(buf, count, raw)
 //
-ssize_t GTMTCPSocket::recv(void* buf, size_t count)
+ssize_t GTMTCPSocket::recv(void* buf, size_t count, bool raw)
 {
 	if (_fd < 0) {
 		LOG_WARN("recv, error: Socket not opend");
@@ -110,9 +110,9 @@ ssize_t GTMTCPSocket::recv(void* buf, size_t count)
 		else {
 			countLeft -= received;
 		}      
-	} while (countLeft > 0);
+	} while (!raw && (countLeft > 0));
 
-	return count;
+	return (count - countLeft);
 }
 
 //
diff --git a/MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.h b/MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.h
index ab992cce9fe..55003b83776 100644
--- a/MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.h
+++ b/MAC/GCF/TM/src/PortImpl/GTM_TCPSocket.h
@@ -26,12 +26,9 @@
 #include "GTM_File.h"
 #include <Common/lofar_string.h>
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace TM 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
 
 // forward declaration
 class GCFTCPPort;
@@ -43,31 +40,26 @@ class GCFTCPPort;
 
 class GTMTCPSocket : public GTMFile
 {
-  public: // constructors, destructors and default operators
+public: 
+	// constructors, destructors and default operators
     GTMTCPSocket (GCFTCPPort& port);
     virtual ~GTMTCPSocket ();
   
-  private:
-    GTMTCPSocket ();
-    /// Don't allow copying of the GTMTCPSocket object.
-    GTMTCPSocket (const GTMTCPSocket&);
-    GTMTCPSocket& operator= (const GTMTCPSocket&);
-
-  
-  public: // GTMTCPSocket specific member methods
-    /**
-     * open/close methods
-     */
+	// GTMTCPSocket specific member methods
+    // open/close methods
     virtual bool open (unsigned int portNumber);
     virtual bool connect (unsigned int portNumber, const string& host);
   
-    /**
-     * send/recv methods
-     */
+    // send/recv methods
     virtual ssize_t send (void* buf, size_t count);
-    virtual ssize_t recv (void* buf, size_t count);
+    virtual ssize_t recv (void* buf, size_t count, bool raw = false);
+
+private:
+    GTMTCPSocket ();
+    /// Don't allow copying of the GTMTCPSocket object.
+    GTMTCPSocket (const GTMTCPSocket&);
+    GTMTCPSocket& operator= (const GTMTCPSocket&);
 
-  protected: // data member
 };
 
   } // namespace TM
diff --git a/MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.cc b/MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.cc
index cc414f1ef90..11fbdfc7a1d 100644
--- a/MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.cc
+++ b/MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.cc
@@ -73,15 +73,13 @@ GTMSBTCPPort::~GTMSBTCPPort()
 bool GTMSBTCPPort::open()
 {
 	if (isConnected()) {
-		LOG_ERROR(formatString ("Port %s already open.", 
-								makeServiceName().c_str()));
+		LOG_ERROR(formatString ("Port %s already open.", makeServiceName().c_str()));
 		return false;
 	}
 
 	if (!_pSocket) {
 		if (isSlave()) {
-			LOG_ERROR(formatString ("Port %s not initialised.", 
-									makeServiceName().c_str()));
+			LOG_ERROR(formatString ("Port %s not initialised.", makeServiceName().c_str()));
 			return false;
 		}
 
diff --git a/MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.h b/MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.h
index 4b10b4dba64..0f589388c7f 100644
--- a/MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.h
+++ b/MAC/GCF/TM/src/ServiceBroker/GTM_SBTCPPort.h
@@ -25,12 +25,9 @@
 
 #include <GCF/TM/GCF_TCPPort.h>
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace SB 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace SB {
 
 // forward declaration
 
diff --git a/MAC/GCF/TM/src/ServiceBroker/ServiceBrokerTask.cc b/MAC/GCF/TM/src/ServiceBroker/ServiceBrokerTask.cc
index 205a7601310..16462726a82 100644
--- a/MAC/GCF/TM/src/ServiceBroker/ServiceBrokerTask.cc
+++ b/MAC/GCF/TM/src/ServiceBroker/ServiceBrokerTask.cc
@@ -81,7 +81,7 @@ ServiceBrokerTask* ServiceBrokerTask::instance(bool temporary)
 		GTMSBHandler::_pInstance->use();
 	}
 
-	return &GTMSBHandler::_pInstance->_controller;
+	return (&GTMSBHandler::_pInstance->_controller);
 }
 
 //
@@ -267,7 +267,7 @@ void ServiceBrokerTask::_logResult(uint16	 	result,
 		break;
 
 		case SB_UNKNOWN_SERVICE:
-			LOG_FATAL_STR("Unknown remote service: "<< servicename << "@" << hostname);
+			LOG_WARN_STR("Unknown remote service: "<< servicename << "@" << hostname);
 		break;
 
 		case SB_NO_CONNECTION:
@@ -332,6 +332,7 @@ void ServiceBrokerTask::_doActionList(const string&	hostname)
 	if (itsActionList.empty()) {
 		return;
 	}
+	_printActionList();
 
 	// Note: while processing the list, the list grows. Therefore we use actionsLeft.
 	ALiter		end  = itsActionList.end();
@@ -430,17 +431,44 @@ void ServiceBrokerTask::_reconnectBrokers()
 //	}
 }
 
+//
+// _printActionList
+//
+void ServiceBrokerTask::_printActionList()
+{
+	if (itsActionList.empty()) {
+		return;
+	}
+
+	ALiter	end  = itsActionList.end();
+	ALiter	iter = itsActionList.begin();
+	string	typeName;
+	LOG_TRACE_FLOW_STR("ActionList at " << time(0));
+	while (iter != end) {
+		switch (iter->type) {
+		case SB_REGISTER_SERVICE:	typeName = "Register";		break;
+		case SB_UNREGISTER_SERVICE: typeName = "Unregister";	break;
+		case SB_GET_SERVICEINFO: 	typeName = "ServiceInfo";	break;
+		default:					typeName = "???";			break;
+		}
+
+		LOG_DEBUG_STR(typeName << " " << iter->servicename << "@" << iter->hostname << 
+						"(" << iter->timestamp << ")");
+		++iter;
+	}
+}
+
 //
 // _checkActionList(hostname);
 //
 void ServiceBrokerTask::_checkActionList(const string&	hostname)
 {
 	LOG_TRACE_FLOW_STR("_checkActionList(" << hostname <<")");
+	_printActionList();
 
 	ALiter	end  = itsActionList.end();
 	ALiter	iter = itsActionList.begin();
 	time_t	currentTime = time(0);
-
 	// check for which actions we are late.
 	while (iter != end) {
 		if (iter->hostname == hostname && currentTime > iter->timestamp+itsMaxResponse) {
diff --git a/MAC/GCF/TM/src/ServiceBroker/ServiceBrokerTask.h b/MAC/GCF/TM/src/ServiceBroker/ServiceBrokerTask.h
index 32a93a2ecd8..88f888100c8 100644
--- a/MAC/GCF/TM/src/ServiceBroker/ServiceBrokerTask.h
+++ b/MAC/GCF/TM/src/ServiceBroker/ServiceBrokerTask.h
@@ -28,20 +28,27 @@
 #include <Common/lofar_list.h>
 #include <MACIO/GCF_Event.h>
 #include <GCF/TM/GCF_Task.h>
-#include "GTM_SBTCPPort.h"
 #include <GCF/TM/GCF_Handler.h>
+#include <GCF/TM/GCF_TCPPort.h>
+#include <GCF/TM/GCF_TimerPort.h>
+#include "GTM_SBTCPPort.h"
 
 namespace LOFAR {
- using MACIO::GCFEvent;
- namespace GCF {  
-  namespace SB {
+  using MACIO::GCFEvent;
+  namespace GCF {
+	using TM::GCFPortInterface;
+	using TM::GCFTCPPort;
+	using TM::GCFTimerPort;
+	using TM::GCFTask;
+	using TM::GCFHandler;
+	namespace SB {
 
 /**
 */
 
 class GTMSBHandler;
 
-class ServiceBrokerTask : public TM::GCFTask
+class ServiceBrokerTask : public GCFTask
 {
 public:
     ~ServiceBrokerTask ();
@@ -49,25 +56,25 @@ public:
     static void release();
 
 	// member functions
-    void registerService  (TM::GCFTCPPort&	servicePort);
-    void unregisterService(TM::GCFTCPPort&	servicePort);
-    void getServiceinfo   (TM::GCFTCPPort&	clientPort, 
+    void registerService  (GCFTCPPort&	servicePort);
+    void unregisterService(GCFTCPPort&	servicePort);
+    void getServiceinfo   (GCFTCPPort&	clientPort, 
 						   const string& 	remoteServiceName,
 						   const string&	hostname);
-    void deletePort		  (TM::GCFTCPPort&	port);
+    void deletePort		  (GCFTCPPort&	port);
   
 private:
     friend class GTMSBHandler;
     ServiceBrokerTask ();
 
 	// state methods
-    GCFEvent::TResult operational (GCFEvent& e, TM::GCFPortInterface& p);
+    GCFEvent::TResult operational (GCFEvent& e, GCFPortInterface& p);
         
 	// helper structures and classes
     typedef struct action_t {
 		uint16				seqnr;
 		uint16 				type;
-		TM::GCFTCPPort*		pPort;
+		GCFTCPPort*		pPort;
 		string 				servicename;
 		string				hostname;
 		time_t				timestamp;
@@ -100,6 +107,7 @@ private:
 	void	_deleteService     (GCFTCPPort&			aPort);
     uint16	_registerAction    (Action 				action);
 	void	_doActionList	   (const string&		hostname);
+	void	_printActionList   ();
 	ALiter	_findAction		   (uint16				seqnr);
 	BMiter	_getBroker		   (const string&		hostname);
 	void	_reconnectBrokers  ();
@@ -120,7 +128,7 @@ private:
 
 };
 
-class GTMSBHandler : public TM::GCFHandler
+class GTMSBHandler : public GCFHandler
 {
 public:
     ~GTMSBHandler() { _pInstance = 0; }
diff --git a/MAC/GCF/TM/src/Timer/GTM_Timer.cc b/MAC/GCF/TM/src/Timer/GTM_Timer.cc
index 01ed3aa6e49..8438ee9aa25 100644
--- a/MAC/GCF/TM/src/Timer/GTM_Timer.cc
+++ b/MAC/GCF/TM/src/Timer/GTM_Timer.cc
@@ -30,7 +30,7 @@
 #include <Timer/GTM_Timer.h>
 #include <GCF/TM/GCF_RawPort.h>
 #include <GCF/TM/GCF_Protocols.h>
-#include <GTM_Defines.h>
+#include <GCF/TM/GCF_Scheduler.h>
 
 namespace LOFAR 
 {
@@ -71,7 +71,7 @@ void GTMTimer::decreaseTime()
 	te.usec = now.tv_usec;
 	te.id   = _id;
 	te.arg  = _arg;
-	_port.dispatch(te);
+	GCFScheduler::instance()->queueEvent(0, te, &_port);
 
 	if (_intervalTime == 0) {
 		_elapsed = true;
diff --git a/MAC/GCF/TM/src/Timer/GTM_TimerHandler.cc b/MAC/GCF/TM/src/Timer/GTM_TimerHandler.cc
index b0a8d024891..ba6bcd30451 100644
--- a/MAC/GCF/TM/src/Timer/GTM_TimerHandler.cc
+++ b/MAC/GCF/TM/src/Timer/GTM_TimerHandler.cc
@@ -29,19 +29,15 @@
 #include <Timer/GTM_Timer.h>
 #include <GCF/TM/GCF_Task.h>
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace TM 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
 
 GTMTimerHandler* GTMTimerHandler::_pInstance = 0;
 
 GTMTimerHandler* GTMTimerHandler::instance()
 {
-  if (0 == _pInstance)
-  {
+  if (0 == _pInstance) {
     _pInstance = new GTMTimerHandler();
     ASSERT(!_pInstance->mayDeleted());
   }
@@ -54,8 +50,7 @@ void GTMTimerHandler::release()
   ASSERT(_pInstance);
   ASSERT(!_pInstance->mayDeleted());
   _pInstance->leave(); 
-  if (_pInstance->mayDeleted())
-  {
+  if (_pInstance->mayDeleted()) {
     delete _pInstance;
     ASSERT(!_pInstance);
   }
@@ -69,9 +64,7 @@ GTMTimerHandler::GTMTimerHandler() :
 GTMTimerHandler::~GTMTimerHandler()
 { 
   GTMTimer* pCurTimer(0);
-  for (TTimers::iterator iter = _timers.begin(); 
-       iter != _timers.end(); ++iter)
-  {
+  for (TTimers::iterator iter = _timers.begin(); iter != _timers.end(); ++iter) {
     pCurTimer = iter->second;
     ASSERT(pCurTimer);
     delete pCurTimer;
@@ -92,18 +85,14 @@ void GTMTimerHandler::workProc()
   TTimers tempTimers;
   tempTimers.insert(_timers.begin(), _timers.end());
     
-  for (TTimers::iterator iter = tempTimers.begin(); 
-       iter != tempTimers.end() && _running; ++iter)
-  {
+  for (TTimers::iterator iter = tempTimers.begin(); iter != tempTimers.end() && _running; ++iter) {
     pCurTimer = iter->second;
     ASSERT(pCurTimer);
-    if (pCurTimer->isElapsed() || pCurTimer->isCanceled())
-    {
+    if (pCurTimer->isElapsed() || pCurTimer->isCanceled()) {
       delete pCurTimer;
       _timers.erase(iter->first);
     }
-    else
-    {
+    else {
       pCurTimer->decreaseTime();	// and dispatch F_TIMER when elapsed
     }
   }
@@ -118,8 +107,7 @@ unsigned long GTMTimerHandler::setTimer(GCFRawPort& port,
 
   // search the first unused timerid
   TTimers::iterator iter;
-  do 
-  {
+  do {
     timerid++;
     iter = _timers.find(timerid);
   }
@@ -140,14 +128,19 @@ int GTMTimerHandler::cancelTimer(unsigned long timerid, void** arg)
   int result(0);
   GTMTimer* pCurTimer(0);
   TTimers::iterator iter = _timers.find(timerid);
-  if (arg) *arg = 0;
-  if (iter == _timers.end())
+  if (arg) {
+	*arg = 0;
+  }
+  if (iter == _timers.end()) {
     return result;
+  }
   pCurTimer = iter->second;
 
   ASSERT(pCurTimer);
   result = 1;
-  if (arg) *arg = pCurTimer->getTimerArg();
+  if (arg) {
+	*arg = pCurTimer->getTimerArg();
+  }
   pCurTimer->cancel();
   
   return result;
@@ -158,13 +151,10 @@ int GTMTimerHandler::cancelAllTimers(GCFRawPort& port)
   int result(0);
   GTMTimer* pCurTimer(0);
   
-  for (TTimers::iterator iter = _timers.begin(); 
-       iter != _timers.end(); ++iter)
-  {
+  for (TTimers::iterator iter = _timers.begin(); iter != _timers.end(); ++iter) {
     pCurTimer = iter->second;
     ASSERT(pCurTimer);
-    if (&(pCurTimer->getPort()) == &port)
-    {  
+    if (&(pCurTimer->getPort()) == &port) {  
       pCurTimer->cancel();
       result++;
     }
diff --git a/MAC/GCF/TM/src/Timer/GTM_TimerHandler.h b/MAC/GCF/TM/src/Timer/GTM_TimerHandler.h
index 46e53c9f63d..13d4a6d4196 100644
--- a/MAC/GCF/TM/src/Timer/GTM_TimerHandler.h
+++ b/MAC/GCF/TM/src/Timer/GTM_TimerHandler.h
@@ -23,14 +23,12 @@
 #ifndef GTM_TIMERHANDLER_H
 #define GTM_TIMERHANDLER_H
 
+#include <Common/lofar_map.h>
 #include <GCF/TM/GCF_Handler.h>
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace TM 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
 
 class GTMTimer;
 class GCFRawPort;
@@ -64,9 +62,7 @@ class GTMTimerHandler : GCFHandler
     GTMTimerHandler ();
     static GTMTimerHandler* _pInstance;
 
-    /**
-     * Don't allow copying of the GTMTimerHandler object.
-     */
+    // Don't allow copying of the GTMTimerHandler object.
     GTMTimerHandler (const GTMTimerHandler&);
     GTMTimerHandler& operator= (const GTMTimerHandler&);
     
diff --git a/MAC/GCF/TM/test/Echo.cc b/MAC/GCF/TM/test/Echo.cc
index 38cf27a13e5..f6ba7196a3b 100644
--- a/MAC/GCF/TM/test/Echo.cc
+++ b/MAC/GCF/TM/test/Echo.cc
@@ -22,9 +22,9 @@
 //  $Id$
 
 #include <lofar_config.h>
-#include "Echo.h"
+#include <Common/LofarLogger.h>
 #include "Echo_Protocol.ph"
-#include <Common/lofar_iostream.h>
+#include "Echo.h"
 
 static 	int		gDelay = 0;
 static	timeval	gTime;
@@ -40,11 +40,13 @@ Echo::Echo(string name) : GCFTask((State)&Echo::initial, name)
   registerProtocol(ECHO_PROTOCOL, ECHO_PROTOCOL_STRINGS);
 
   // initialize the port
-  server.init(*this, "EchoServer", GCFPortInterface::SPP, ECHO_PROTOCOL);
+  server = new GCFTCPPort(*this, "EchoServer:test", GCFPortInterface::MSPP, ECHO_PROTOCOL);
 }
 
 GCFEvent::TResult Echo::initial(GCFEvent& e, GCFPortInterface& /*p*/)
 {
+	LOG_DEBUG_STR("Echo::initial: " << eventName(e));
+
   GCFEvent::TResult status = GCFEvent::HANDLED;
 
 	switch (e.signal) {
@@ -52,24 +54,17 @@ GCFEvent::TResult Echo::initial(GCFEvent& e, GCFPortInterface& /*p*/)
 		break;
 
     case F_ENTRY:
-    case F_TIMER:
-		if (!server.isConnected())
-			server.open();
+		server->open();
 		break;
 
     case F_CONNECTED:
-		if (server.isConnected()) {
+		if (server->isConnected()) {
 			TRAN(Echo::connected);
 		}
 		break;
 
-    case F_DISCONNECTED:
-		if (!server.isConnected()) {
-			server.setTimer(1.0); // try again after 1 second
-		}
-		break;
-
     default:
+		LOG_DEBUG_STR("$$$ DEFAULT at initial of " << eventName(e));
 		status = GCFEvent::NOT_HANDLED;
 		break;
 	}
@@ -79,9 +74,19 @@ GCFEvent::TResult Echo::initial(GCFEvent& e, GCFPortInterface& /*p*/)
 
 GCFEvent::TResult Echo::connected(GCFEvent& e, GCFPortInterface& p)
 {
+	LOG_DEBUG_STR("Echo::connected: " << eventName(e));
+
 	GCFEvent::TResult status = GCFEvent::HANDLED;
 
 	switch (e.signal) {
+	case F_ACCEPT_REQ: {
+		GCFTCPPort*		clientSock = new GCFTCPPort();
+		clientSock->init(*this, "clientSock", GCFPortInterface::SPP, ECHO_PROTOCOL);
+		ASSERTSTR(clientSock, "Blerk");
+		server->accept(*clientSock);
+		break;
+	}
+
 	case F_DISCONNECTED:
 		cout << "Lost connection to client" << endl;
 		p.close();
@@ -101,7 +106,7 @@ GCFEvent::TResult Echo::connected(GCFEvent& e, GCFPortInterface& p)
 		// otherwise an interrupt will be forced by means of setting the pin 9.
 		cout << "PING received (seqnr=" << ping.seqnr << ")" << endl;
 		cout << "delay = " << gDelay << endl;
-		server.setTimer((gDelay < 0) ? -1.0 * gDelay : 1.0 * gDelay);
+		server->setTimer((gDelay < 0) ? -1.0 * gDelay : 1.0 * gDelay);
 		gSeqnr = ping.seqnr;
 		gTime  = ping.ping_time;
 		break;
@@ -121,7 +126,7 @@ GCFEvent::TResult Echo::connected(GCFEvent& e, GCFPortInterface& p)
 		echo.ping_time = gTime;
 		echo.echo_time = echo_time;
 
-		server.send(echo);
+		server->send(echo);
 
 		cout << "ECHO sent" << endl;
 		break;
@@ -139,7 +144,11 @@ GCFEvent::TResult Echo::connected(GCFEvent& e, GCFPortInterface& p)
 		break;
 	}
 
+	case F_CONNECTED:
+		break;
+
 	default:
+		LOG_DEBUG_STR("$$$ DEFAULT at connected of " << eventName(e));
 		status = GCFEvent::NOT_HANDLED;
 		break;
 	}
@@ -156,7 +165,7 @@ using namespace std;
 
 int main(int argc, char* argv[])
 {
-	GCFTask::init(argc, argv);
+	GCFScheduler::instance()->init(argc, argv);
 
 	switch (argc) {
 	case 1:		gDelay = 0;
@@ -174,7 +183,7 @@ int main(int argc, char* argv[])
 
 	Echo echo_task("ECHO");
 	echo_task.start(); // make initial transition
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/GCF/TM/test/Echo.h b/MAC/GCF/TM/test/Echo.h
index bc73ac0eed9..28720502100 100644
--- a/MAC/GCF/TM/test/Echo.h
+++ b/MAC/GCF/TM/test/Echo.h
@@ -27,12 +27,9 @@
 
 #include <GCF/TM/GCF_Control.h>
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace TM 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
 
 /**
  * The Echo task receives ECHO_PING events from the Ping task and
@@ -72,7 +69,7 @@ class Echo : public GCFTask
    * task are received on the server port. And reply events to the Ping task
    * are sent through the server port.
    */
-  GCFPort server;
+  GCFTCPPort* server;
 };
 
   } // namespace TM
diff --git a/MAC/GCF/TM/test/Makefile.am b/MAC/GCF/TM/test/Makefile.am
index 7170bcf67f0..b361623e4fc 100644
--- a/MAC/GCF/TM/test/Makefile.am
+++ b/MAC/GCF/TM/test/Makefile.am
@@ -6,25 +6,37 @@ SUFFIXES = .ph
 %.cc: %.prot
 	$(AUTOGEN) --writable -L $(datadir)/MACIO $<
 
-check_PROGRAMS 		= tmEcho tmPing tGCFPort tTimer \
+check_PROGRAMS 			= tAutoOpen tEventQueue tStateResult tmEcho tmPing tGCFPort tTimer \
 						tGCFTask1 tGCFTask2 tGCFTask3 tGCFTask4 tGCFTask5
 
-tmEcho_SOURCES 		= $(BUILT_SOURCES) Echo_Protocol.cc Echo.cc Echo.h 
-tmEcho_LDADD		= ../src/libgcftm.la
-tmEcho_DEPENDENCIES	= ../src/libgcftm.la $(LOFAR_DEPEND)
+tmEcho_SOURCES 			= $(BUILT_SOURCES) Echo.cc Echo_Protocol.cc
+tmEcho_LDADD			= ../src/libgcftm.la
+tmEcho_DEPENDENCIES		= ../src/libgcftm.la $(LOFAR_DEPEND)
 
-tmPing_SOURCES 		= $(BUILT_SOURCES) Echo_Protocol.cc Ping.cc Ping.h
-tmPing_LDADD		= ../src/libgcftm.la
-tmPing_DEPENDENCIES	= ../src/libgcftm.la $(LOFAR_DEPEND)
+tmPing_SOURCES 			= $(BUILT_SOURCES) Ping.cc Echo_Protocol.cc
+tmPing_LDADD			= ../src/libgcftm.la
+tmPing_DEPENDENCIES		= ../src/libgcftm.la $(LOFAR_DEPEND)
 
 tGCFPort_SOURCES 		= $(BUILT_SOURCES) Echo_Protocol.cc \
 						  tGCFPort.cc tGCFPort.h 
 tGCFPort_LDADD			= ../src/libgcftm.la
 tGCFPort_DEPENDENCIES	= ../src/libgcftm.la $(LOFAR_DEPEND)
 
-tTimer_SOURCES 		= $(BUILT_SOURCES) tTimer.cc
-tTimer_LDADD		= ../src/libgcftm.la
-tTimer_DEPENDENCIES	= ../src/libgcftm.la tTimer.h $(LOFAR_DEPEND)
+tTimer_SOURCES 			= $(BUILT_SOURCES) tTimer.cc
+tTimer_LDADD			= ../src/libgcftm.la
+tTimer_DEPENDENCIES		= ../src/libgcftm.la tTimer.h $(LOFAR_DEPEND)
+
+tEventQueue_SOURCES 	= $(BUILT_SOURCES) tEventQueue.cc tClient.cc Echo_Protocol.cc
+tEventQueue_LDADD		= ../src/libgcftm.la
+tEventQueue_DEPENDENCIES= ../src/libgcftm.la $(LOFAR_DEPEND)
+
+tAutoOpen_SOURCES 		= $(BUILT_SOURCES) tAutoOpen.cc tServer.cc Echo_Protocol.cc
+tAutoOpen_LDADD			= ../src/libgcftm.la
+tAutoOpen_DEPENDENCIES  = ../src/libgcftm.la $(LOFAR_DEPEND)
+
+tStateResult_SOURCES	 = $(BUILT_SOURCES) tStateResult.cc tServer.cc Echo_Protocol.cc
+tStateResult_LDADD		 = ../src/libgcftm.la
+tStateResult_DEPENDENCIES= ../src/libgcftm.la $(LOFAR_DEPEND)
 
 tGCFTask1_SOURCES 		= $(BUILT_SOURCES) tGCFTask1.cc testTask.cc
 tGCFTask1_LDADD			= ../src/libgcftm.la
diff --git a/MAC/GCF/TM/test/Makefile.in b/MAC/GCF/TM/test/Makefile.in
new file mode 100644
index 00000000000..1af3453d9e2
--- /dev/null
+++ b/MAC/GCF/TM/test/Makefile.in
@@ -0,0 +1,907 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Some common rules.
+SOURCES = $(tAutoOpen_SOURCES) $(tEventQueue_SOURCES) $(tGCFPort_SOURCES) $(tGCFTask1_SOURCES) $(tGCFTask2_SOURCES) $(tGCFTask3_SOURCES) $(tGCFTask4_SOURCES) $(tGCFTask5_SOURCES) $(tStateResult_SOURCES) $(tTimer_SOURCES) $(tmEcho_SOURCES) $(tmPing_SOURCES)
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = tAutoOpen$(EXEEXT) tEventQueue$(EXEEXT) \
+	tStateResult$(EXEEXT) tmEcho$(EXEEXT) tmPing$(EXEEXT) \
+	tGCFPort$(EXEEXT) tTimer$(EXEEXT) tGCFTask1$(EXEEXT) \
+	tGCFTask2$(EXEEXT) tGCFTask3$(EXEEXT) tGCFTask4$(EXEEXT) \
+	tGCFTask5$(EXEEXT)
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Makefile.common
+subdir = test
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/autoconf_share/am_rpm_init.m4 \
+	$(top_srcdir)/autoconf_share/lofar_docxx.m4 \
+	$(top_srcdir)/autoconf_share/lofar_external.m4 \
+	$(top_srcdir)/autoconf_share/lofar_general.m4 \
+	$(top_srcdir)/autoconf_share/lofar_init.m4 \
+	$(top_srcdir)/autoconf_share/lofar_internal.m4 \
+	$(top_srcdir)/autoconf_share/lofar_logger.m4 \
+	$(top_srcdir)/autoconf_share/lofar_qatools.m4 \
+	$(top_srcdir)/autoconf_share/lofar_shmem.m4 \
+	$(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__objects_1 =
+am_tAutoOpen_OBJECTS = $(am__objects_1) tAutoOpen.$(OBJEXT) \
+	tServer.$(OBJEXT) Echo_Protocol.$(OBJEXT)
+tAutoOpen_OBJECTS = $(am_tAutoOpen_OBJECTS)
+am_tEventQueue_OBJECTS = $(am__objects_1) tEventQueue.$(OBJEXT) \
+	tClient.$(OBJEXT) Echo_Protocol.$(OBJEXT)
+tEventQueue_OBJECTS = $(am_tEventQueue_OBJECTS)
+am_tGCFPort_OBJECTS = $(am__objects_1) Echo_Protocol.$(OBJEXT) \
+	tGCFPort.$(OBJEXT)
+tGCFPort_OBJECTS = $(am_tGCFPort_OBJECTS)
+am_tGCFTask1_OBJECTS = $(am__objects_1) tGCFTask1.$(OBJEXT) \
+	testTask.$(OBJEXT)
+tGCFTask1_OBJECTS = $(am_tGCFTask1_OBJECTS)
+am_tGCFTask2_OBJECTS = $(am__objects_1) tGCFTask2.$(OBJEXT) \
+	testTask.$(OBJEXT)
+tGCFTask2_OBJECTS = $(am_tGCFTask2_OBJECTS)
+am_tGCFTask3_OBJECTS = $(am__objects_1) tGCFTask3.$(OBJEXT) \
+	testTask.$(OBJEXT)
+tGCFTask3_OBJECTS = $(am_tGCFTask3_OBJECTS)
+am_tGCFTask4_OBJECTS = $(am__objects_1) tGCFTask4.$(OBJEXT) \
+	testTask.$(OBJEXT)
+tGCFTask4_OBJECTS = $(am_tGCFTask4_OBJECTS)
+am_tGCFTask5_OBJECTS = $(am__objects_1) tGCFTask5.$(OBJEXT) \
+	testTask.$(OBJEXT)
+tGCFTask5_OBJECTS = $(am_tGCFTask5_OBJECTS)
+am_tStateResult_OBJECTS = $(am__objects_1) tStateResult.$(OBJEXT) \
+	tServer.$(OBJEXT) Echo_Protocol.$(OBJEXT)
+tStateResult_OBJECTS = $(am_tStateResult_OBJECTS)
+am_tTimer_OBJECTS = $(am__objects_1) tTimer.$(OBJEXT)
+tTimer_OBJECTS = $(am_tTimer_OBJECTS)
+am_tmEcho_OBJECTS = $(am__objects_1) Echo.$(OBJEXT) \
+	Echo_Protocol.$(OBJEXT)
+tmEcho_OBJECTS = $(am_tmEcho_OBJECTS)
+am_tmPing_OBJECTS = $(am__objects_1) Ping.$(OBJEXT) \
+	Echo_Protocol.$(OBJEXT)
+tmPing_OBJECTS = $(am_tmPing_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link --tag=CXX $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(tAutoOpen_SOURCES) $(tEventQueue_SOURCES) \
+	$(tGCFPort_SOURCES) $(tGCFTask1_SOURCES) $(tGCFTask2_SOURCES) \
+	$(tGCFTask3_SOURCES) $(tGCFTask4_SOURCES) $(tGCFTask5_SOURCES) \
+	$(tStateResult_SOURCES) $(tTimer_SOURCES) $(tmEcho_SOURCES) \
+	$(tmPing_SOURCES)
+DIST_SOURCES = $(tAutoOpen_SOURCES) $(tEventQueue_SOURCES) \
+	$(tGCFPort_SOURCES) $(tGCFTask1_SOURCES) $(tGCFTask2_SOURCES) \
+	$(tGCFTask3_SOURCES) $(tGCFTask4_SOURCES) $(tGCFTask5_SOURCES) \
+	$(tStateResult_SOURCES) $(tTimer_SOURCES) $(tmEcho_SOURCES) \
+	$(tmPing_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AR_FLAGS = @AR_FLAGS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DOCPP = @DOCPP@
+DOCPPFLAGS = @DOCPPFLAGS@
+DOXYGEN = @DOXYGEN@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+HAVE_COMMON_FALSE = @HAVE_COMMON_FALSE@
+HAVE_COMMON_TRUE = @HAVE_COMMON_TRUE@
+HAVE_DOCPP_FALSE = @HAVE_DOCPP_FALSE@
+HAVE_DOCPP_TRUE = @HAVE_DOCPP_TRUE@
+HAVE_DOXYGEN_FALSE = @HAVE_DOXYGEN_FALSE@
+HAVE_DOXYGEN_TRUE = @HAVE_DOXYGEN_TRUE@
+HAVE_LOG4CPLUS_FALSE = @HAVE_LOG4CPLUS_FALSE@
+HAVE_LOG4CPLUS_TRUE = @HAVE_LOG4CPLUS_TRUE@
+HAVE_LOG4CXX_FALSE = @HAVE_LOG4CXX_FALSE@
+HAVE_LOG4CXX_TRUE = @HAVE_LOG4CXX_TRUE@
+HAVE_MACIO_FALSE = @HAVE_MACIO_FALSE@
+HAVE_MACIO_TRUE = @HAVE_MACIO_TRUE@
+HAVE_SHMEM_FALSE = @HAVE_SHMEM_FALSE@
+HAVE_SHMEM_TRUE = @HAVE_SHMEM_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LOFARROOT = @LOFARROOT@
+LOFAR_DEPEND = @LOFAR_DEPEND@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MAKE_RPMS = @MAKE_RPMS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+RPMBUILD_PROG = @RPMBUILD_PROG@
+RPM_ARGS = @RPM_ARGS@
+RPM_CONFIGURE_ARGS = @RPM_CONFIGURE_ARGS@
+RPM_DIR = @RPM_DIR@
+RPM_PROG = @RPM_PROG@
+RPM_RELEASE = @RPM_RELEASE@
+RPM_TARBALL = @RPM_TARBALL@
+RPM_TARGET = @RPM_TARGET@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_BACKTRACE_FALSE = @USE_BACKTRACE_FALSE@
+USE_BACKTRACE_TRUE = @USE_BACKTRACE_TRUE@
+VERSION = @VERSION@
+YACC = @YACC@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+docpp_found = @docpp_found@
+doxygen_dot_found = @doxygen_dot_found@
+doxygen_found = @doxygen_found@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+lofar_compiler = @lofar_compiler@
+lofar_doctool = @lofar_doctool@
+lofar_root = @lofar_root@
+lofar_root_libdir = @lofar_root_libdir@
+lofar_sharedir = @lofar_sharedir@
+lofar_top_srcdir = @lofar_top_srcdir@
+lofar_use_root = @lofar_use_root@
+lofar_variant = @lofar_variant@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AUTOGEN = autogen
+SUFFIXES = .ph
+tmEcho_SOURCES = $(BUILT_SOURCES) Echo.cc Echo_Protocol.cc
+tmEcho_LDADD = ../src/libgcftm.la
+tmEcho_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tmPing_SOURCES = $(BUILT_SOURCES) Ping.cc Echo_Protocol.cc
+tmPing_LDADD = ../src/libgcftm.la
+tmPing_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tGCFPort_SOURCES = $(BUILT_SOURCES) Echo_Protocol.cc \
+						  tGCFPort.cc tGCFPort.h 
+
+tGCFPort_LDADD = ../src/libgcftm.la
+tGCFPort_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tTimer_SOURCES = $(BUILT_SOURCES) tTimer.cc
+tTimer_LDADD = ../src/libgcftm.la
+tTimer_DEPENDENCIES = ../src/libgcftm.la tTimer.h $(LOFAR_DEPEND)
+tEventQueue_SOURCES = $(BUILT_SOURCES) tEventQueue.cc tClient.cc Echo_Protocol.cc
+tEventQueue_LDADD = ../src/libgcftm.la
+tEventQueue_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tAutoOpen_SOURCES = $(BUILT_SOURCES) tAutoOpen.cc tServer.cc Echo_Protocol.cc
+tAutoOpen_LDADD = ../src/libgcftm.la
+tAutoOpen_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tStateResult_SOURCES = $(BUILT_SOURCES) tStateResult.cc tServer.cc Echo_Protocol.cc
+tStateResult_LDADD = ../src/libgcftm.la
+tStateResult_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tGCFTask1_SOURCES = $(BUILT_SOURCES) tGCFTask1.cc testTask.cc
+tGCFTask1_LDADD = ../src/libgcftm.la
+tGCFTask1_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tGCFTask2_SOURCES = $(BUILT_SOURCES) tGCFTask2.cc testTask.cc
+tGCFTask2_LDADD = ../src/libgcftm.la
+tGCFTask2_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tGCFTask3_SOURCES = $(BUILT_SOURCES) tGCFTask3.cc testTask.cc
+tGCFTask3_LDADD = ../src/libgcftm.la
+tGCFTask3_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tGCFTask4_SOURCES = $(BUILT_SOURCES) tGCFTask4.cc testTask.cc
+tGCFTask4_LDADD = ../src/libgcftm.la
+tGCFTask4_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+tGCFTask5_SOURCES = $(BUILT_SOURCES) tGCFTask5.cc testTask.cc
+tGCFTask5_LDADD = ../src/libgcftm.la
+tGCFTask5_DEPENDENCIES = ../src/libgcftm.la $(LOFAR_DEPEND)
+BUILT_SOURCES = Echo_Protocol.ph 
+EXTRA_DIST = \
+	tmEcho.conf \
+	tmPing.conf \
+	tGCFPort.conf
+
+#CLEANFILES += tca.* .inslog* *.cc *.h $(top_builddir)/pure_cache docxxhtml/* *.log docxx_hdrs.names
+
+# DISTCLEANFILES also removes the md5 check files created by rub,
+# so configure is executed again.
+DISTCLEANFILES = \
+      pkgext*\
+      lofar_config.*\
+      FillPackage__Version* \
+      .doxygenrc \
+      *.spec \
+      *.md5-check \
+      *.err
+
+
+# Rules for building documentation using doxygen or doc++.
+# Default output directory is docxxhtml.
+DOCDIR := docxxhtml
+
+#
+#
+# Target to be able to do a system build.
+# By default it does a check, but no install.
+WITH_CLEAN = 0
+WITH_INSTALL = 0
+WITH_CHECK = 1
+CHECKTOOL = 
+
+# Define the default variables to export to the test scripts.
+TESTS_ENVIRONMENT = LOFARROOT="$(LOFARROOT)" \
+                    lofar_sharedir="$(lofar_sharedir)" \
+                    prefix="$(prefix)" \
+                    top_srcdir="$(top_srcdir)" \
+                    srcdir="$(srcdir)" \
+		    CHECKTOOLPROGS="$(CHECKTOOLPROGS)" \
+		    MPIBIN="$(MPIBIN)" \
+		    AIPSPP="$(AIPSPP)"
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .ph .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/Makefile.common $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  test/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign  test/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+tAutoOpen$(EXEEXT): $(tAutoOpen_OBJECTS) $(tAutoOpen_DEPENDENCIES) 
+	@rm -f tAutoOpen$(EXEEXT)
+	$(CXXLINK) $(tAutoOpen_LDFLAGS) $(tAutoOpen_OBJECTS) $(tAutoOpen_LDADD) $(LIBS)
+tEventQueue$(EXEEXT): $(tEventQueue_OBJECTS) $(tEventQueue_DEPENDENCIES) 
+	@rm -f tEventQueue$(EXEEXT)
+	$(CXXLINK) $(tEventQueue_LDFLAGS) $(tEventQueue_OBJECTS) $(tEventQueue_LDADD) $(LIBS)
+tGCFPort$(EXEEXT): $(tGCFPort_OBJECTS) $(tGCFPort_DEPENDENCIES) 
+	@rm -f tGCFPort$(EXEEXT)
+	$(CXXLINK) $(tGCFPort_LDFLAGS) $(tGCFPort_OBJECTS) $(tGCFPort_LDADD) $(LIBS)
+tGCFTask1$(EXEEXT): $(tGCFTask1_OBJECTS) $(tGCFTask1_DEPENDENCIES) 
+	@rm -f tGCFTask1$(EXEEXT)
+	$(CXXLINK) $(tGCFTask1_LDFLAGS) $(tGCFTask1_OBJECTS) $(tGCFTask1_LDADD) $(LIBS)
+tGCFTask2$(EXEEXT): $(tGCFTask2_OBJECTS) $(tGCFTask2_DEPENDENCIES) 
+	@rm -f tGCFTask2$(EXEEXT)
+	$(CXXLINK) $(tGCFTask2_LDFLAGS) $(tGCFTask2_OBJECTS) $(tGCFTask2_LDADD) $(LIBS)
+tGCFTask3$(EXEEXT): $(tGCFTask3_OBJECTS) $(tGCFTask3_DEPENDENCIES) 
+	@rm -f tGCFTask3$(EXEEXT)
+	$(CXXLINK) $(tGCFTask3_LDFLAGS) $(tGCFTask3_OBJECTS) $(tGCFTask3_LDADD) $(LIBS)
+tGCFTask4$(EXEEXT): $(tGCFTask4_OBJECTS) $(tGCFTask4_DEPENDENCIES) 
+	@rm -f tGCFTask4$(EXEEXT)
+	$(CXXLINK) $(tGCFTask4_LDFLAGS) $(tGCFTask4_OBJECTS) $(tGCFTask4_LDADD) $(LIBS)
+tGCFTask5$(EXEEXT): $(tGCFTask5_OBJECTS) $(tGCFTask5_DEPENDENCIES) 
+	@rm -f tGCFTask5$(EXEEXT)
+	$(CXXLINK) $(tGCFTask5_LDFLAGS) $(tGCFTask5_OBJECTS) $(tGCFTask5_LDADD) $(LIBS)
+tStateResult$(EXEEXT): $(tStateResult_OBJECTS) $(tStateResult_DEPENDENCIES) 
+	@rm -f tStateResult$(EXEEXT)
+	$(CXXLINK) $(tStateResult_LDFLAGS) $(tStateResult_OBJECTS) $(tStateResult_LDADD) $(LIBS)
+tTimer$(EXEEXT): $(tTimer_OBJECTS) $(tTimer_DEPENDENCIES) 
+	@rm -f tTimer$(EXEEXT)
+	$(CXXLINK) $(tTimer_LDFLAGS) $(tTimer_OBJECTS) $(tTimer_LDADD) $(LIBS)
+tmEcho$(EXEEXT): $(tmEcho_OBJECTS) $(tmEcho_DEPENDENCIES) 
+	@rm -f tmEcho$(EXEEXT)
+	$(CXXLINK) $(tmEcho_LDFLAGS) $(tmEcho_OBJECTS) $(tmEcho_LDADD) $(LIBS)
+tmPing$(EXEEXT): $(tmPing_OBJECTS) $(tmPing_DEPENDENCIES) 
+	@rm -f tmPing$(EXEEXT)
+	$(CXXLINK) $(tmPing_LDFLAGS) $(tmPing_OBJECTS) $(tmPing_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Echo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Echo_Protocol.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Ping.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tAutoOpen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tClient.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tEventQueue.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tGCFPort.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tGCFTask1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tGCFTask2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tGCFTask3.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tGCFTask4.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tGCFTask5.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tServer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tStateResult.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tTimer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testTask.Po@am__quote@
+
+.cc.o:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+@am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+@am__fastdepCXX_TRUE@	if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(mkdir_p) $(distdir)/..
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile
+installdirs:
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+	ctags distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-exec install-exec-am install-info \
+	install-info-am install-man install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-info-am
+
+%.ph: %.prot
+	$(AUTOGEN) --writable -L $(datadir)/MACIO $<
+
+%.cc: %.prot
+	$(AUTOGEN) --writable -L $(datadir)/MACIO $<
+
+%.conf:	tm-test.conf.in
+	ln -sf $< $@
+
+clean-local:
+	rm -f *.ph
+
+# CLEANFILES cannot delete directories, therefore use target clean-generic.
+clean-generic:
+	-rm -rf ti_files
+	-rm -f tca.*
+	-rm -f .inslog*
+	-rm -f *.log
+	-rm -f *.i
+	-rm -f *.s
+	-rm -f src/*.h
+	-rm -f *.hh
+	-rm -f *.cc
+	-rm -f *.cs_cc
+	-rm -f doxygen.cfg
+	-rm -rf $(top_builddir)/pure_cache
+	-rm -rf docxxhtml
+
+# Rule to delete all files generated by bootstrap.
+# This is sometimes needed when switching to another version of autotools.
+confclean: pkgclean
+pkgclean: distclean
+	  -rm -rf $(srcdir)/autom4te.cache
+	  -rm -f $(srcdir)/config.*
+	  -rm -f $(srcdir)/{configure,aclocal.m4,depcomp,install-sh,ltmain.sh}
+	  -rm -f $(srcdir)/{Makefile.in,missing,mkinstalldirs}
+	  -rm -f $(srcdir)/{Makefile.common,autoconf_share,lofarconf}
+
+# Make the rpm if possible.
+# Note:
+# MAKE_RPMS is set by lofar_init and possibly overwritten by lofar_general.
+# Older package releases include Makefile.common from $lofar_sharedir
+# with the effect that the include is handled by make.
+# Newer releases (as of 1-11-2005) include Makefile.common from $top_srcdir
+# with the effect that the include is handled by automake.
+# To be compatible with older releases, it was decided that the MAKE_RPMS
+# should be handled by make, hence the blank before endif. Otherwise
+# automake complains about an endif without an if.
+ ifeq "$(MAKE_RPMS)" "true"
+   rpm: dist @RPM_TARGET@
+   $(RPM_TARGET): $(DISTFILES)
+	${MAKE} dist
+	-mkdir -p $(RPM_DIR)/SRPMS
+	-mkdir -p `dirname $(RPM_TARGET)`
+	$(RPM_PROG) $(RPM_ARGS) $(RPM_TARBALL)
+	@echo Congratulations, $(RPM_TARGET) "(and friends)" should now exist.
+ endif
+# Put the phony target outside the if, otherwise automake gives
+# warnings if a .PHONY is also defined in the Makefile.am.
+.PHONY: rpm
+
+# Only preprocess the file.
+%.i: %.cc
+	$(CXX) -E $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $< > $@
+%.i: %.c
+	$(CC) -E $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $< > $@
+
+# Only compile (but not assemble) the file.
+%.s: %.cc
+	$(CXX) -S $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $<
+%.s: %.c
+	$(CC) -S $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $<
+
+# Rules for preprocessing idl files.
+# There should be a corresponding .cc file in the source directory
+# including the .cs_cc file.
+%.cs_cc: %.idl
+	$(IDLCXX) $(IDLFLAGS) $(AM_IDLFLAGS) $<
+	echo '#include "$*_c.cc"' >  $*.cs_cc
+	echo '#include "$*_s.cc"' >> $*.cs_cc
+
+# Rules for preprocessing Qt sources.
+%.moc.cc: %.h
+	$(QT_DIR)/bin/moc $< -o $@
+
+# Rule to build all test programs.
+test: $(check_PROGRAMS)
+
+# Rule to build and run one or more test programs.
+# The programs to build/run must be defined in the PGM variable.
+checkrun:
+	@if [ "$(PGM)" = "" ] ; then \
+	   echo "Error: use as: make (mem)checkrun PGM=testprogram"; \
+	 else \
+	   curwd=`pwd`; \
+	   bcurwd=`basename $$curwd`; \
+	   if [ "$$bcurwd" != test ]; then \
+	     echo "Error: run (mem)checkrun in test directory"; \
+	   else \
+	     PGMB=; \
+	     PGMT=; \
+	     for PGMVAR in $(PGM) ; \
+	     do \
+	       grep "^ *$${PGMVAR}_SOURCES" $(srcdir)/Makefile.am >& /dev/null; \
+	       if [ $$? = 0 ]; then \
+	         PGMB="$$PGMB $$PGMVAR"; \
+	       fi; \
+	       PGMTST=$$PGMVAR; \
+	       if [ -f $(srcdir)/$${PGMVAR}.sh ] ; then \
+	         PGMTST=$(srcdir)/$${PGMVAR}.sh; \
+	       elif [ -f $(srcdir)/$${PGMVAR}_test.sh ] ; then \
+	         PGMTST=$(srcdir)/$${PGMVAR}_test.sh; \
+	       fi; \
+	       PGMT="$$PGMT $$PGMTST"; \
+	     done; \
+	     echo "make check CHECKTOOL='$(CHECKTOOL)' check_PROGRAMS='$$PGMB' TESTS='$$PGMT'"; \
+	     make check CHECKTOOL="$(CHECKTOOL)" check_PROGRAMS="$$PGMB" TESTS="$$PGMT"; \
+	   fi \
+	 fi
+
+# Rule to run test programs using valgrind's memcheck tool.
+memcheck:
+	@$(RM) `find . -name "*.valgrind.*"`
+	make check CHECKTOOL='valgrind --tool=memcheck --num-callers=50 --leak-check=yes --track-fds=yes --log-file=[PROGNAME].valgrind'
+	@vgfils=`find . -name "*.valgrind.*"`; \
+	vgfils=`echo $$vgfils`; \
+	nrvg=`echo "$$vgfils" | wc -w`; \
+	nrvg=`echo $$nrvg`; \
+	if [ "$$nrvg" != 0  -a  "$$nrvg" != "" ]; then \
+	  echo ''; \
+	  echo "memcheck error summary from $$nrvg *.valgrind.* file(s)"; \
+	  echo '--------------------------------------------------'; \
+	  (grep "ERROR SUMMARY: " `echo $$vgfils` | grep -v " 0 errors ") || echo "No memory check errors"; \
+	  (grep "definitely lost: " `echo $$vgfils` | grep -v " 0 bytes ") || echo "No definite memory leaks"; \
+	  (grep "possibly lost: " `echo $$vgfils` | grep -v " 0 bytes ") || echo "No possible memory leaks"; \
+	  (grep " open file descriptor " `echo $$vgfils` | grep -v "descriptor [012]:") || echo "No file descriptor leaks"; \
+	fi
+
+# Rule to build and run memcheck for one or more test programs.
+# The programs to build/run must be defined in the PGM variable.
+memcheckrun:
+	$(RM) `find . -name "*.valgrind.*"`
+	make checkrun CHECKTOOL='valgrind --tool=memcheck --num-callers=50 --leak-check=yes --track-fds=yes --log-file=[PROGNAME].valgrind' PGM="$(PGM)"
+	@vgfils=`find . -name "*.valgrind.*"`; \
+	vgfils=`echo $$vgfils`; \
+	nrvg=`echo "$$vgfils" | wc -w`; \
+	nrvg=`echo $$nrvg`; \
+	if [ "$$nrvg" != 0  -a  "$$nrvg" != "" ]; then \
+	  echo ''; \
+	  echo "memcheckrun error summary from $$nrvg *.valgrind.* file(s)"; \
+	  echo '-----------------------------------------------------'; \
+	  (grep "ERROR SUMMARY: " `echo $$vgfils` | grep -v " 0 errors ") || echo "No memory check errors"; \
+	  (grep "definitely lost: " `echo $$vgfils` | grep -v " 0 bytes ") || echo "No definite memory leaks"; \
+	  (grep "possibly lost: " `echo $$vgfils` | grep -v " 0 bytes ") || echo "No possible memory leaks"; \
+	  (grep " open file descriptor " `echo $$vgfils` | grep -v "descriptor [012]:") || echo "No file descriptor leaks"; \
+	fi
+
+doc:
+	@if [ "$(lofar_doctool)" = "doxygen" ] ; then \
+	  cp $(top_builddir)/.doxygenrc doxygen.cfg ; \
+	  projnm=`(cd $(srcdir) && pwd) | sed -e "s%.*/LOFAR/%%"` ; \
+	  echo "PROJECT_NAME = $$projnm" >> doxygen.cfg ; \
+	  echo "INPUT = $(srcdir)" >> doxygen.cfg ; \
+	  echo "RECURSIVE = YES" >> doxygen.cfg ; \
+	  echo "HTML_OUTPUT = $(DOCDIR)" >> doxygen.cfg ; \
+	  echo "EXCLUDE = $(srcdir)/build $(srcdir)/test $(srcdir)/demo" >> doxygen.cfg; \
+          echo "GENERATE_TAGFILE = `basename $$projnm`.tag" >> doxygen.cfg ; \
+	  $(DOXYGEN) doxygen.cfg ; \
+	else \
+	  if [ "$(lofar_doctool)" = "docpp" ] ; then \
+	    $(DOCPP) $(DOCPPFLAGS) --dir $(DOCDIR) `find $(srcdir) -name "*.h" -print` ; \
+	  else \
+	    echo "Error: No documentation tool configured" ; \
+	  fi \
+	fi
+
+docthis:
+	@if [ "$(lofar_doctool)" = "doxygen" ] ; then \
+	  cp $(top_builddir)/.doxygenrc doxygen.cfg ; \
+	  projnm=`(cd $(srcdir) && pwd) | sed -e "s%.*/LOFAR/%%"` ; \
+	  echo "PROJECT_NAME = $$projnm" >> doxygen.cfg ; \
+	  echo "INPUT = $(srcdir)/src" >> doxygen.cfg ; \
+	  echo "RECURSIVE = NO" >> doxygen.cfg ; \
+	  echo "HTML_OUTPUT = $(DOCDIR)" >> doxygen.cfg ; \
+	  $(DOXYGEN) doxygen.cfg ; \
+	else \
+	  if [ "$(lofar_doctool)" = "docpp" ] ; then \
+	    $(DOCPP) $(DOCPPFLAGS) --dir $(DOCDIR) $(srcdir)/*.h ; \
+	  else \
+	    echo "Error: No documentation tool configured" ; \
+	  fi \
+	fi
+build_system:
+	@if test 2 -eq $(WITH_CLEAN); then \
+	  $(MAKE) distclean ; \
+	  ../../lofarconf; \
+	fi; \
+	if test 1 -eq $(WITH_CLEAN); then \
+	  $(MAKE) clean ; \
+	fi; \
+	$(MAKE); \
+	if test 1 -eq $(WITH_CHECK); then \
+	  $(MAKE) check CHECKTOOL="$(CHECKTOOL)"; \
+	fi; \
+	if test 1 -eq $(WITH_INSTALL); then \
+	  $(MAKE) install ; \
+	fi;
+
+# Show the important make variables.
+show:
+	@echo "CXX      = $(CXX)";
+	@echo "   `$(CXX) --version | head -1`";
+	@echo "CPPFLAGS = $(AM_CPPFLAGS) $(CPPFLAGS)";
+	@echo "CXXFLAGS = $(AM_CXXFLAGS) $(CXXFLAGS)";
+	@echo "LDFLAGS  = $(AM_LDFLAGS) $(LDFLAGS)";
+	@echo "LIBS     = $(LIBS)";
+	@echo "MPIBIN   = $(MPIBIN)";
+	@echo "AIPSPP   = $(AIPSPP)";
+	@echo "prefix   = $(prefix)";
+
+help:
+	@echo "make targets";
+	@echo "------------";
+	@echo "show              show important make variables";
+	@echo "pgm               build test program pgm (in test directory)";
+	@echo "test              build all test programs";
+	@echo "check             build, run, and check all test programs";
+	@echo "check CHECKTOOL=  check test programs with a checktool (like valgrind)";
+	@echo "memcheck          check CHECKTOOL='valgrind --tool=memcheck"
+	@echo "                    --num-callers=50 --leak-check=yes --track-fds=yes'"
+	@echo "checkrun PGM=     build, run, and check given test program(s)";
+	@echo "memcheckrun PGM=  build, run, and memcheck given test program(s)";
+	@echo ""
+	@echo "file.o            make object file (in src or test directory)";
+	@echo "file.i            make preprocessed file";
+	@echo "file.s            make assembly file";
+	@echo "clean             remove object files, etc."
+	@echo "distclean         remove almost everything; requires a new lofarconf";
+	@echo "pkgclean          distclean and remove files generated by bootstrap";
+	@echo "                    requires a new bootstrap and lofarconf";
+	@echo "install           install package in $(prefix)";
+	@echo "dist              make a distribution";
+	@echo "distcheck         make and check a distribution";
+	@echo "rpm               make an rpm";
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/MAC/GCF/TM/test/Ping.cc b/MAC/GCF/TM/test/Ping.cc
index f7bff32d552..eddbcc96365 100644
--- a/MAC/GCF/TM/test/Ping.cc
+++ b/MAC/GCF/TM/test/Ping.cc
@@ -23,10 +23,10 @@
 //
 
 #include <lofar_config.h>
-
+#include <Common/LofarLogger.h>
 #include "Ping.h"
 #include "Echo_Protocol.ph"
-#include <Common/lofar_iostream.h>
+
 
 namespace LOFAR 
 {
@@ -58,7 +58,7 @@ Ping::Ping(string name)
    * - This is a Service Access Port which uses the
    *   ECHO_PROTOCOL 
    */
-  client.init(*this, "client", GCFPortInterface::SAP, ECHO_PROTOCOL);
+  client.init(*this, "EchoServer:test", GCFPortInterface::SAP, ECHO_PROTOCOL);
 }
 
 Ping::~Ping()
@@ -68,6 +68,8 @@ Ping::~Ping()
 
 GCFEvent::TResult Ping::initial(GCFEvent& e, GCFPortInterface& /*port*/)
 {
+	LOG_DEBUG_STR("Ping::initial: " << eventName(e));
+
   GCFEvent::TResult status = GCFEvent::HANDLED;
 
   switch (e.signal)
@@ -107,6 +109,8 @@ GCFEvent::TResult Ping::initial(GCFEvent& e, GCFPortInterface& /*port*/)
 
 GCFEvent::TResult Ping::connected(GCFEvent& e, GCFPortInterface& p)
 {
+	LOG_DEBUG_STR("Ping::connected: " << eventName(e));
+
   GCFEvent::TResult status = GCFEvent::HANDLED;
 
   static int seqnr = 0;
@@ -156,6 +160,8 @@ GCFEvent::TResult Ping::connected(GCFEvent& e, GCFPortInterface& p)
 
 GCFEvent::TResult Ping::awaiting_echo(GCFEvent& e, GCFPortInterface& p)
 {
+	LOG_DEBUG_STR("Ping::awaiting_echo: " << eventName(e));
+
   GCFEvent::TResult status = GCFEvent::HANDLED;
 
   switch (e.signal)
@@ -175,7 +181,7 @@ GCFEvent::TResult Ping::awaiting_echo(GCFEvent& e, GCFPortInterface& p)
     	     << time_elapsed(&(echo.ping_time), &echo_time) << " sec."<< endl;
       if (echo.seqnr == 600)
       {
-        GCFTask::stop();
+        GCFScheduler::instance()->stop();
       }
       else
       {
@@ -206,13 +212,13 @@ using namespace LOFAR::GCF::TM;
 
 int main(int argc, char* argv[])
 {
-  GCFTask::init(argc, argv);
+  GCFScheduler::instance()->init(argc, argv);
 
   Ping ping_task("PING");
 
   ping_task.start(); // make initial transition
 
-  GCFTask::run();
+  GCFScheduler::instance()->run();
 
   return 0;
 }
diff --git a/MAC/GCF/TM/test/Ping.h b/MAC/GCF/TM/test/Ping.h
index 2eb044d97a4..b32f0e43d14 100644
--- a/MAC/GCF/TM/test/Ping.h
+++ b/MAC/GCF/TM/test/Ping.h
@@ -27,12 +27,9 @@
 #include <GCF/TM/GCF_Control.h>
 #include <sys/time.h>
 
-namespace LOFAR 
-{
- namespace GCF 
- {
-  namespace TM 
-  {
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
 
 /**
  * The Ping task sends ECHO_PING events to the Echo task and expects 
diff --git a/MAC/GCF/TM/test/tAutoOpen.cc b/MAC/GCF/TM/test/tAutoOpen.cc
new file mode 100644
index 00000000000..7a9ff80f2f2
--- /dev/null
+++ b/MAC/GCF/TM/test/tAutoOpen.cc
@@ -0,0 +1,370 @@
+//
+//  tAutoOpen.cc: Test program to test all kind of usage of the GCF ports.
+//
+//  Copyright (C) 2009
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+
+#include <lofar_config.h>
+#include <Common/LofarLogger.h>
+#include <GCF/TM/GCF_Scheduler.h>
+#include "Echo_Protocol.ph"
+#include "tAutoOpen.h"
+#include "tServer.h"
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+
+// Constructors of both classes
+tAutoOpen::tAutoOpen(string name) : 
+	GCFTask        ((State)&tAutoOpen::retryTest, name),
+	itsTimerPort   (0),
+	itsConn 	   (0)
+{ 
+	registerProtocol (ECHO_PROTOCOL, ECHO_PROTOCOL_STRINGS);
+}
+
+tAutoOpen::~tAutoOpen()
+{
+	delete itsTimerPort;
+}
+
+//
+// retryTest
+//
+// Try to autoOpen a connection to a non existing server specifying several retries but no timeout.
+//
+GCFEvent::TResult tAutoOpen::retryTest(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tAutoOpen::retryTest: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		break;
+
+	case F_INIT:
+		itsConn = new GCFTCPPort(*this, "Echo:Server", GCFPortInterface::SAP, ECHO_PROTOCOL, false);
+		ASSERTSTR(itsConn, "Can't allocate a TCPport");
+		LOG_DEBUG("Calling autoOpen(5, 0, 4)");
+		itsConn->autoOpen(5, 0, 4); // nrRetry, timeout, retryItv
+		break;
+
+	case F_CONNECTED:
+		LOG_DEBUG_STR("THIS IS REALY STRANGE!!!");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("Seems that retries are working, going to try the timeout.");
+		TRAN(tAutoOpen::timeoutTest);
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in retryTest");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in retryTest: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+//
+// timeoutTest
+//
+// Try to autoOpen a connection to a non existing server specifying a timeout
+//
+GCFEvent::TResult tAutoOpen::timeoutTest(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tAutoOpen::timeoutTest: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		LOG_DEBUG("\n\n\n\nCalling autoOpen(0, 18, 4)");
+		itsConn->autoOpen(0, 18, 4); // nrRetry, timeout, retryItv
+		break;
+
+	case F_CONNECTED:
+		LOG_DEBUG_STR("THIS IS REALY STRANGE!!!");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("timeTest seems to be working, trying next mode");
+		TRAN(tAutoOpen::zeroTest);
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in timeoutTest");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in timeoutTest: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+
+//
+// zeroTest
+//
+// Try to autoOpen a connection to a non existing server not setting the number of retries
+// nor setting the timeout timer. This should behave like a normal open() call.
+//
+GCFEvent::TResult tAutoOpen::zeroTest(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tAutoOpen::zeroTest: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		LOG_DEBUG("\n\n\n\nCalling autoOpen(0, 0, 4)");
+		itsConn->autoOpen(0, 0, 4); // nrRetry, timeout, retryItv
+		break;
+
+	case F_CONNECTED:
+		LOG_DEBUG_STR("THIS IS REALY STRANGE!!!");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("Seems to be working, going to the next test");
+		TRAN(tAutoOpen::double1Test);
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in zeroTest");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in zeroTest: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+//
+// double1Test
+//
+// Try to autoOpen a connection to a non existing server setting the number of retries
+// AND setting the timeout timer. The nr of retries is smaller than the maxTimeout.
+//
+GCFEvent::TResult tAutoOpen::double1Test(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tAutoOpen::double1Test: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		LOG_DEBUG("\n\n\n\nCalling autoOpen(3, 60, 4)");
+		itsConn->autoOpen(3, 60, 4); // nrRetry, timeout, retryItv
+		break;
+
+	case F_CONNECTED:
+		LOG_DEBUG_STR("THIS IS REALY STRANGE!!!");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("Seems to be working, going to the next test");
+		TRAN(tAutoOpen::double2Test);
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in double1Test");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in double1Test: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+//
+// double2Test
+//
+// Try to autoOpen a connection to a non existing server setting the number of retries
+// AND setting the timeout timer. The nr of retries is larger than the maxTimeout.
+//
+GCFEvent::TResult tAutoOpen::double2Test(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tAutoOpen::double2Test: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		LOG_DEBUG("\n\n\n\nCalling autoOpen(6, 10, 4)");
+		itsConn->autoOpen(6, 10, 4); // nrRetry, timeout, retryItv
+		break;
+
+	case F_CONNECTED:
+		LOG_DEBUG_STR("THIS IS REALY STRANGE!!!");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("Seems to be working, going to the next test");
+		TRAN(tAutoOpen::openTest);
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in double2Test");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in double2Test: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+//
+// openTest
+//
+// Test is the old open() call is still working.
+//
+GCFEvent::TResult tAutoOpen::openTest(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tAutoOpen::openTest: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		LOG_DEBUG("\n\n\n\nCalling open()");
+		itsConn->open();
+		break;
+
+	case F_CONNECTED:
+		LOG_DEBUG_STR("THIS IS REALY STRANGE!!!");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("Seems to be working, going to last test");
+		TRAN(tAutoOpen::relayedOpenTest);
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in openTest");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in openTest: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+//
+// relayedOpenTest
+//
+// Start a server task that will open the listener after 25 second. Start an autoOpen call
+// in this taks and wait till the connection is established.
+//
+GCFEvent::TResult tAutoOpen::relayedOpenTest(GCFEvent& event, GCFPortInterface& port)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tAutoOpen::relayedOpenTest: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		LOG_DEBUG("\n\n\n\nStarting the server task");
+		tServer*	server = new tServer("Server", 25);
+		server->start();
+		itsConn->autoOpen(10, 0, 10);	// connect within 100 seconds.
+		break;
+
+	case F_CONNECTED: {
+		LOG_DEBUG("COOL its is realy working");
+		EchoPingEvent	ping;
+		ping.seqnr=300563;
+		port.send(ping);
+		break;
+	}
+
+	case ECHO_ECHO: {
+		EchoEchoEvent	echo(event);
+		if (echo.seqnr != 300563) {
+			LOG_ERROR("Wrong sequence number");
+		}
+		else {
+			LOG_DEBUG("Got the right answer from the server, FINISHED the tests");
+		}
+		GCFScheduler::instance()->stop();
+		break;
+	}
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("WE STILL HAVE A PROBLEM");
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in relayedOpenTest");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in relayedOpenTest: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+
+using namespace LOFAR::GCF::TM;
+
+//
+// MAIN()
+//
+int main(int argc, char* argv[])
+{
+	GCFScheduler*	theScheduler(GCFScheduler::instance());
+	theScheduler->init(argc, argv);
+
+	tAutoOpen	clientTask("clientTask");
+	clientTask.start(); // make initial transition
+
+	theScheduler->run();
+
+	return (0);
+}
diff --git a/MAC/GCF/TM/test/tAutoOpen.h b/MAC/GCF/TM/test/tAutoOpen.h
new file mode 100644
index 00000000000..fc6308d5230
--- /dev/null
+++ b/MAC/GCF/TM/test/tAutoOpen.h
@@ -0,0 +1,66 @@
+//
+//  tAutoOpen.h: Test program to test all kind of usage of the GCF ports.
+//
+//  Copyright (C) 2006
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+//
+
+#ifndef _TEVENTQUEUE_H
+#define _TEVENTQUEUE_H
+
+#include <GCF/TM/GCF_Control.h>
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+//
+// The tests use two different tasks, a tServer task and a tClient task.
+// In each test a different way of resolving the addresses is used or
+// different device types are used.
+// The tServer and tClient class use the Echo protocol to test the
+// communication.
+//
+
+class tAutoOpen : public GCFTask
+{
+public:
+	tAutoOpen (string name);
+	~tAutoOpen();
+
+	// The test states
+	GCFEvent::TResult retryTest 	  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult timeoutTest 	  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult zeroTest	 	  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult double1Test 	  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult double2Test 	  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult openTest	 	  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult relayedOpenTest (GCFEvent& e, GCFPortInterface& p);
+
+private:
+	GCFTimerPort*	itsTimerPort;
+	GCFTCPPort*		itsListener;
+	GCFTCPPort*		itsConn;
+};
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+#endif
diff --git a/MAC/GCF/TM/test/tClient.cc b/MAC/GCF/TM/test/tClient.cc
new file mode 100644
index 00000000000..a8563f5b7c6
--- /dev/null
+++ b/MAC/GCF/TM/test/tClient.cc
@@ -0,0 +1,145 @@
+//
+//  tClient.cc: Test program to test all kind of usage of the GCF ports.
+//
+//  Copyright (C) 2006
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+
+#include <lofar_config.h>
+#include <Common/LofarLogger.h>
+#include <GCF/TM/GCF_Scheduler.h>
+#include "Echo_Protocol.ph"
+#include "tClient.h"
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+
+// Constructors of both classes
+tClient::tClient(string name) : 
+	GCFTask         ((State)&tClient::connect2Server, name),
+	itsTimerPort    (0),
+	itsDataPort		(0)
+{ 
+}
+
+tClient::~tClient()
+{
+	delete itsTimerPort;
+	delete itsDataPort;
+}
+
+//
+// connect2Server
+//
+// We simply set one timer in different ways and wait for the timer to expire.
+//
+GCFEvent::TResult tClient::connect2Server(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tClient::connect2Server: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		itsTimerPort = new GCFTimerPort(*this, "timerPort");
+		ASSERTSTR(itsTimerPort, "Failed to open timerport");
+		break;
+
+	case F_INIT:
+		LOG_DEBUG_STR("trying to connect 2 the server");
+		itsDataPort = new GCFTCPPort(*this, "EchoServer:v1.0", GCFPortInterface::SAP, ECHO_PROTOCOL, false);
+		ASSERTSTR(itsDataPort, "Cannot allocate a data port");
+		itsDataPort->open();
+		break;
+
+	case F_CONNECTED: 
+		LOG_INFO("YES, we are connected, Sending a ping within 5 seconds");
+		itsTimerPort->setTimer(5.0);
+		break;
+
+	case F_TIMER:
+		TRAN(tClient::sendPing);
+		break;
+
+	case F_DISCONNECTED: 
+		LOG_INFO("SH..., the connection failed");
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in connect2Server");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in connect2Server: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+//
+// sendPing
+//
+// Send a Ping command and wait for the response
+//
+GCFEvent::TResult tClient::sendPing(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tClient::sendPing: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY: {
+		EchoPingEvent	ping;
+		ping.seqnr = 25;
+		itsDataPort->send(ping);
+		break;
+	}
+
+	case ECHO_ECHO: {
+		EchoEchoEvent	echo(event);
+		LOG_INFO("YES, we got an echo, closing connection");
+		itsDataPort->close();
+		break;
+	}
+
+	case F_DISCONNECTED: 
+		LOG_INFO("Port is closed");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in sendPing");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in connect2Server: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+
diff --git a/MAC/GCF/TM/test/tClient.h b/MAC/GCF/TM/test/tClient.h
new file mode 100644
index 00000000000..a0bde272b1e
--- /dev/null
+++ b/MAC/GCF/TM/test/tClient.h
@@ -0,0 +1,60 @@
+//
+//  tClient.h: Test program to test all kind of usage of the GCF ports.
+//
+//  Copyright (C) 2006
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+//
+
+#ifndef _TCLIENT_H
+#define _TCLIENT_H
+
+#include <GCF/TM/GCF_Control.h>
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+//
+// The tests use two different tasks, a tServer task and a tClient task.
+// In each test a different way of resolving the addresses is used or
+// different device types are used.
+// The tServer and tClient class use the Echo protocol to test the
+// communication.
+//
+
+class tClient : public GCFTask
+{
+public:
+	tClient (string name);
+	~tClient();
+
+	// The test states
+	GCFEvent::TResult connect2Server 	  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult sendPing			  (GCFEvent& e, GCFPortInterface& p);
+
+private:
+	GCFTimerPort*	itsTimerPort;
+	GCFTCPPort*		itsDataPort;
+};
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+#endif
diff --git a/MAC/GCF/TM/test/tEventQueue.cc b/MAC/GCF/TM/test/tEventQueue.cc
new file mode 100644
index 00000000000..e30fe4acaf6
--- /dev/null
+++ b/MAC/GCF/TM/test/tEventQueue.cc
@@ -0,0 +1,339 @@
+//
+//  tEventQueue.cc: Test program to test all kind of usage of the GCF ports.
+//
+//  Copyright (C) 2006
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+
+#include <lofar_config.h>
+#include <Common/LofarLogger.h>
+#include <GCF/TM/GCF_Scheduler.h>
+#include "Echo_Protocol.ph"
+#include "tEventQueue.h"
+#include "tClient.h"
+
+static	int	gTest = 0;
+static	int	gTimerID;
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+
+// Constructors of both classes
+tEventQueue::tEventQueue(string name) : 
+	GCFTask         ((State)&tEventQueue::timerTest, name),
+	itsTimerPort    (0)
+{ 
+	registerProtocol (ECHO_PROTOCOL, ECHO_PROTOCOL_STRINGS);
+}
+
+tEventQueue::~tEventQueue()
+{
+	delete itsTimerPort;
+}
+
+//
+// timerTest
+//
+// We simply set one timer in different ways and wait for the timer to expire.
+//
+GCFEvent::TResult tEventQueue::timerTest(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tEventQueue::timerTest: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		itsTimerPort = new GCFTimerPort(*this, "timerPort");
+		ASSERTSTR(itsTimerPort, "Failed to open timerport");
+		break;
+
+	case F_INIT:
+		gTest=1;
+		gTimerID = itsTimerPort->setTimer(1.0);
+		LOG_DEBUG_STR("setTimer(1.0) = " << gTimerID);
+		break;
+
+	case F_TIMER: {
+		switch (gTest) {
+			case 1: {	// wait for setTimer(1.0)
+				GCFTimerEvent& timerEvent = static_cast<GCFTimerEvent&>(event);
+				LOG_DEBUG_STR("ID = " << timerEvent.id << ", arg = " << timerEvent.arg);
+
+				gTimerID = itsTimerPort->setTimer(1.0, 2.0);
+				LOG_DEBUG_STR("setTimer(1.0, 2.0) = " << gTimerID);
+				gTest++;
+			}
+			break;
+
+			case 2: { // wait for first expire of setTimer(1.0, 2.0)
+				GCFTimerEvent& timerEvent = static_cast<GCFTimerEvent&>(event);
+				LOG_DEBUG_STR("ID = " << timerEvent.id << ", arg = " << timerEvent.arg);
+				gTest++;
+			}
+			break;
+
+			case 3: {	// wait for second expire of setTimer(1.0, 2.0)
+				GCFTimerEvent& timerEvent = static_cast<GCFTimerEvent&>(event);
+				LOG_DEBUG_STR("ID = " << timerEvent.id << ", arg = " << timerEvent.arg);
+				itsTimerPort->cancelTimer(gTimerID);
+
+				gTimerID = itsTimerPort->setTimer(1.0, 1.0, (char*)"pietje puk");
+				LOG_DEBUG_STR("setTimer(1.0, 0.0, 'pietje puk') = " << gTimerID);
+				gTest++;
+			}
+			break;
+			case 4: {
+				GCFTimerEvent& timerEvent = static_cast<GCFTimerEvent&>(event);
+				LOG_DEBUG_STR("ID = " << timerEvent.id << ", arg = " << timerEvent.arg);
+				LOG_DEBUG_STR("ID = " << timerEvent.id << ", *arg = " << (char*)timerEvent.arg);
+				gTest++;
+			}
+			break;
+
+			default: {
+				GCFTimerEvent& timerEvent = static_cast<GCFTimerEvent&>(event);
+				LOG_DEBUG_STR("ID = " << timerEvent.id << ", *arg = " << (char*)timerEvent.arg);
+				if (gTest++ > 8) {
+					itsTimerPort->cancelTimer(gTimerID);
+					LOG_INFO("Timertest passed, Going to the next statemachine\n\n\n");
+					TRAN(tEventQueue::tranTest);
+					LOG_INFO("Just after 'TRAN(tEventQueue::tranTest)', still in timerTest");
+				}
+			}
+			break;
+		}
+		break;
+	}
+	break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in timerTest");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in timerTest: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+//
+// tranTest
+//
+// We simply set one timer in different ways and wait for the timer to expire.
+//
+GCFEvent::TResult tEventQueue::tranTest(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tEventQueue::tranTest: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		LOG_INFO("Just setting a timer to 5 seconds");
+		itsTimerPort->setTimer(5.0);
+		break;
+
+	case F_TIMER:
+		LOG_DEBUG("Timer expired, going to listener test\n\n\n");
+		TRAN(tEventQueue::listenerTest);
+		break;
+
+	case F_EXIT:
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in tranTest: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+//
+// listenerTest 3
+//
+// Opening a listener port AND tries to start a task in a running scheduler.
+//
+GCFEvent::TResult tEventQueue::listenerTest(GCFEvent& event, GCFPortInterface& port)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tEventQueue::listenerTest: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY: {
+			LOG_INFO("Going to open a listener port");
+			itsListener = new GCFTCPPort(*this, "EchoServer:v1.0", GCFPortInterface::MSPP, ECHO_PROTOCOL);
+			ASSERTSTR(itsListener, "Failed to allocate listenerport");
+		}
+		// NO BREAK
+	case F_TIMER:
+		itsListener->open();		// results in F_DISCON or F_CONN
+		break;
+
+	case F_DISCONNECTED:
+		LOG_INFO("Opening listener failed, waiting for close event");
+		port.close();
+		break;
+
+	case F_CLOSED:
+		LOG_INFO("Listener closed, setting timer to 2 seconds for retry");
+		itsTimerPort->setTimer(2.0);
+		break;
+
+	case F_CONNECTED: {
+		itsTimerPort->cancelAllTimers();
+		LOG_INFO("Listener opened, creating a new task now that will connect to me\n\n\n");
+		tClient*	client = new tClient("client");
+		client->start();
+		TRAN(tEventQueue::wait4client2connect);
+		break;
+	}
+
+	case F_EXIT:
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in listenerTest: " << eventName(event));
+		status = GCFEvent::NEXT_STATE;
+		break;
+	}
+
+	return status;
+}
+//
+// wait4client2connect
+//
+// Opening a listener port
+//
+GCFEvent::TResult tEventQueue::wait4client2connect(GCFEvent& event, GCFPortInterface& port)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tEventQueue::wait4client2connect: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		itsTimerPort->setTimer(30.0);		// in case it does not work
+		break;
+
+	case F_TIMER:
+		LOG_INFO("Client did NOT connect, bailing out!");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case F_ACCEPT_REQ:
+		itsClient = new GCFTCPPort();
+		itsClient->init(*this, "client", GCFPortInterface::SPP, ECHO_PROTOCOL);
+		ASSERTSTR(itsListener->accept(*itsClient), "ACCEPT FAILED");
+		break;
+
+	case F_CONNECTED:
+		LOG_INFO("Client is connected, going to do my Server state\n\n\n");
+		itsTimerPort->cancelAllTimers();
+		TRAN(tEventQueue::serverState);
+		break;
+
+	case F_EXIT:
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in wait4client2connect: " << eventName(event));
+		status = GCFEvent::NEXT_STATE;
+		break;
+	}
+
+	return status;
+}
+
+//
+// serverState
+//
+// wait for Ping messages and reply to them
+//
+GCFEvent::TResult tEventQueue::serverState(GCFEvent& event, GCFPortInterface& port)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tEventQueue::serverState: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		itsTimerPort->setTimer(30.0);		// in case it does not work
+		break;
+
+	case F_TIMER:
+		LOG_INFO("Client did NOT send a PING, bailing out!");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case ECHO_PING: {
+		EchoPingEvent	ping(event);
+		EchoEchoEvent	echo;
+		echo.seqnr     = ping.seqnr;
+		port.send(echo);
+		itsTimerPort->cancelAllTimers();
+		LOG_DEBUG_STR("YES, ping was received, echo was sent, I'm ready!");
+		break;
+	}
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("Closing port because i received a disconnect event");
+		port.close();
+
+	case F_CLOSED:
+		LOG_DEBUG_STR("Succesfully terminated the test, Stopping program");
+		GCFScheduler::instance()->stop();
+		break;
+
+	case F_EXIT:
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in serverState: " << eventName(event));
+		status = GCFEvent::HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+
+using namespace LOFAR::GCF::TM;
+
+//
+// MAIN()
+//
+int main(int argc, char* argv[])
+{
+	GCFScheduler*	theScheduler(GCFScheduler::instance());
+	theScheduler->init(argc, argv);
+
+	tEventQueue	eqTask("eqTask");
+	eqTask.start(); // make initial transition
+
+	theScheduler->run();
+
+	return (0);
+}
diff --git a/MAC/GCF/TM/test/tEventQueue.h b/MAC/GCF/TM/test/tEventQueue.h
new file mode 100644
index 00000000000..64614e9c1f9
--- /dev/null
+++ b/MAC/GCF/TM/test/tEventQueue.h
@@ -0,0 +1,64 @@
+//
+//  tEventQueue.h: Test program to test all kind of usage of the GCF ports.
+//
+//  Copyright (C) 2006
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+//
+
+#ifndef _TEVENTQUEUE_H
+#define _TEVENTQUEUE_H
+
+#include <GCF/TM/GCF_Control.h>
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+//
+// The tests use two different tasks, a tServer task and a tClient task.
+// In each test a different way of resolving the addresses is used or
+// different device types are used.
+// The tServer and tClient class use the Echo protocol to test the
+// communication.
+//
+
+class tEventQueue : public GCFTask
+{
+public:
+	tEventQueue (string name);
+	~tEventQueue();
+
+	// The test states
+	GCFEvent::TResult timerTest 		  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult tranTest 			  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult listenerTest 		  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult wait4client2connect (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult serverState		  (GCFEvent& e, GCFPortInterface& p);
+
+private:
+	GCFTimerPort*	itsTimerPort;
+	GCFTCPPort*		itsListener;
+	GCFTCPPort*		itsClient;
+};
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+#endif
diff --git a/MAC/GCF/TM/test/tGCFPort.cc b/MAC/GCF/TM/test/tGCFPort.cc
index f1692480b14..d18eda82904 100644
--- a/MAC/GCF/TM/test/tGCFPort.cc
+++ b/MAC/GCF/TM/test/tGCFPort.cc
@@ -797,7 +797,7 @@ GCFEvent::TResult tServer::test5(GCFEvent& event, GCFPortInterface& /*port*/)
 	case F_DISCONNECTED:
 		if (itsFinished) {	// timer exists when msg was received.
 			finishTest(5);
-			GCFTask::stop();
+			GCFScheduler::instance()->stop();
 //			TRAN(tServer::test3);
 		}
 		else {
@@ -892,7 +892,7 @@ GCFEvent::TResult tClient::test5(GCFEvent& event, GCFPortInterface& port)
 		if (itsFinishedTimer) {
 			LOG_INFO ("Client:Lost connection with server");
 			finishTest(5);
-			GCFTask::stop();
+			GCFScheduler::instance()->stop();
 //			TRAN(tClient::test3);
 		}
 		else {
@@ -929,7 +929,7 @@ using namespace LOFAR::GCF::TM;
 //
 int main(int argc, char* argv[])
 {
-	GCFTask::init(argc, argv);
+	GCFScheduler::instance()->init(argc, argv);
 
 	tServer	serverTask("SERVER");
 	tClient	clientTask("CLIENT");
@@ -937,7 +937,7 @@ int main(int argc, char* argv[])
 	serverTask.start(); // make initial transition
 	clientTask.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	LOG_INFO_STR("Test result=" << gError);
 
diff --git a/MAC/GCF/TM/test/tGCFTask1.cc b/MAC/GCF/TM/test/tGCFTask1.cc
index 0ba9a624547..61e008162b8 100644
--- a/MAC/GCF/TM/test/tGCFTask1.cc
+++ b/MAC/GCF/TM/test/tGCFTask1.cc
@@ -35,7 +35,7 @@ using namespace LOFAR::GCF;
 
 int main(int argc,	char*	argv[]) 
 {
-	GCFTask::init(argc, argv, basename(argv[0]));
+	GCFScheduler::instance()->init(argc, argv, basename(argv[0]));
 
 	LOG_INFO("THIS PROGRAM RUNS UNTIL YOU STOP IT WITH CTRL-C!!!");
 	sleep(2);
@@ -48,7 +48,7 @@ int main(int argc,	char*	argv[])
 	medium.start();
 	slow.start();
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/GCF/TM/test/tGCFTask2.cc b/MAC/GCF/TM/test/tGCFTask2.cc
index 68a1efb9dc7..756fe88bc40 100644
--- a/MAC/GCF/TM/test/tGCFTask2.cc
+++ b/MAC/GCF/TM/test/tGCFTask2.cc
@@ -34,7 +34,7 @@ using namespace LOFAR::GCF;
 
 int main(int argc,	char*	argv[]) 
 {
-	GCFTask::init(argc, argv, basename(argv[0]));
+	GCFScheduler::instance()->init(argc, argv, basename(argv[0]));
 
 	LOG_INFO("THIS PROGRAM RUNS UNTIL YOU STOP IT WITH CTRL-C!!!");
 	sleep(2);
@@ -47,15 +47,15 @@ int main(int argc,	char*	argv[])
 	medium.start();
 	slow.start();
 
-	GCFTask::setDelayedQuit(true);
+	GCFScheduler::instance()->setDelayedQuit(true);
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	fast.quit();
 	medium.quit();
 	slow.quit();
 
-	GCFTask::run(2.0);
+	GCFScheduler::instance()->run(2.0);
 
 	return (0);
 }
diff --git a/MAC/GCF/TM/test/tGCFTask3.cc b/MAC/GCF/TM/test/tGCFTask3.cc
index 7e9b26e8c79..b78d6d16b88 100644
--- a/MAC/GCF/TM/test/tGCFTask3.cc
+++ b/MAC/GCF/TM/test/tGCFTask3.cc
@@ -34,7 +34,7 @@ using namespace LOFAR::GCF;
 
 int main(int argc,	char*	argv[]) 
 {
-	GCFTask::init(argc, argv, basename(argv[0]));
+	GCFScheduler::instance()->init(argc, argv, basename(argv[0]));
 
 	LOG_INFO("THIS PROGRAM WILL AUTOMATICALLY QUIT AFTER 11.3 SECONDS!!!");
 	sleep(2);
@@ -47,7 +47,7 @@ int main(int argc,	char*	argv[])
 	medium.start();
 	slow.start();
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/GCF/TM/test/tGCFTask4.cc b/MAC/GCF/TM/test/tGCFTask4.cc
index 8f80ece6a8a..957957c6833 100644
--- a/MAC/GCF/TM/test/tGCFTask4.cc
+++ b/MAC/GCF/TM/test/tGCFTask4.cc
@@ -34,7 +34,7 @@ using namespace LOFAR::GCF;
 
 int main(int argc,	char*	argv[]) 
 {
-	GCFTask::init(argc, argv, basename(argv[0]));
+	GCFScheduler::instance()->init(argc, argv, basename(argv[0]));
 
 	LOG_INFO("THIS PROGRAM WILL AUTOMATICALLY QUIT AFTER 11.3 SECONDS!!!");
 	sleep(2);
@@ -47,15 +47,15 @@ int main(int argc,	char*	argv[])
 	medium.start();
 	slow.start();
 
-	GCFTask::setDelayedQuit(true);
+	GCFScheduler::instance()->setDelayedQuit(true);
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	fast.quit();
 	medium.quit();
 	slow.quit();
 
-	GCFTask::run(2.0);
+	GCFScheduler::instance()->run(2.0);
 
 	return (0);
 }
diff --git a/MAC/GCF/TM/test/tGCFTask5.cc b/MAC/GCF/TM/test/tGCFTask5.cc
index 6e2a9290243..fa685997146 100644
--- a/MAC/GCF/TM/test/tGCFTask5.cc
+++ b/MAC/GCF/TM/test/tGCFTask5.cc
@@ -34,7 +34,7 @@ using namespace LOFAR::GCF;
 
 int main(int argc,	char*	argv[]) 
 {
-	GCFTask::init(argc, argv, basename(argv[0]));
+	GCFScheduler::instance()->init(argc, argv, basename(argv[0]));
 
 	LOG_INFO("THIS PROGRAM WILL AUTOMATICALLY QUIT AFTER 11.3 SECONDS!!!");
 	sleep(2);
@@ -47,9 +47,9 @@ int main(int argc,	char*	argv[])
 	medium->start();
 	slow.start();
 
-	GCFTask::setDelayedQuit(true);
+	GCFScheduler::instance()->setDelayedQuit(true);
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	fast.quit();
 	LOG_INFO("Destructing the 'medium' task");
@@ -57,7 +57,7 @@ int main(int argc,	char*	argv[])
 	medium = 0;
 	slow.quit();
 
-	GCFTask::run(2.0);
+	GCFScheduler::instance()->run(2.0);
 
 	return (0);
 }
diff --git a/MAC/GCF/TM/test/tServer.cc b/MAC/GCF/TM/test/tServer.cc
new file mode 100644
index 00000000000..a8cb87c9d0b
--- /dev/null
+++ b/MAC/GCF/TM/test/tServer.cc
@@ -0,0 +1,106 @@
+//
+//  tServer.cc: Implements an echo server
+//
+//  Copyright (C) 2009
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+
+#include <lofar_config.h>
+#include <Common/LofarLogger.h>
+#include "tServer.h"
+#include "Echo_Protocol.ph"
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+tServer::tServer(string name, uint	startupDelay) : 
+	GCFTask((State)&tServer::initial, name),
+	itsListener(0),
+	itsTimerPort(0),
+	itsStartupDelay(startupDelay)
+{
+	registerProtocol(ECHO_PROTOCOL, ECHO_PROTOCOL_STRINGS);
+
+	itsListener = new GCFTCPPort(*this, "Echo:Server", GCFPortInterface::SPP, ECHO_PROTOCOL);
+	ASSERTSTR(itsListener, "failed to alloc listener");
+
+	itsTimerPort = new GCFTimerPort(*this, "timerPort");
+	ASSERTSTR(itsTimerPort, "failed to alloc listener");
+}
+
+GCFEvent::TResult tServer::initial(GCFEvent& event, GCFPortInterface& port)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+
+	switch (event.signal) {
+	case F_INIT:
+		int	timerID = itsTimerPort->setTimer(1.0*itsStartupDelay);
+		LOG_DEBUG_STR("WAITING " << itsStartupDelay << " seconds before starting server, timerID=" << timerID);
+		break;
+
+    case F_TIMER:
+		LOG_DEBUG("STARTING server");
+		itsListener->open();
+		break;
+
+    case F_CONNECTED:
+		if (itsListener->isConnected()) {
+			TRAN(tServer::connected);
+		}
+		break;
+
+    case F_DISCONNECTED:
+		ASSERTSTR(false, "Bailing out because server could not be started");
+		GCFScheduler::instance()->stop();
+		break;
+
+    default:
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return (status);
+}
+
+GCFEvent::TResult tServer::connected(GCFEvent& event, GCFPortInterface& port)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+
+	switch (event.signal) {
+	case ECHO_PING: {
+		EchoPingEvent	ping(event);
+		EchoEchoEvent	echo;
+		echo.seqnr     = ping.seqnr;
+		port.send(echo);
+		break;
+	}
+
+	default:
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return (status);
+}
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+
diff --git a/MAC/GCF/TM/test/tServer.h b/MAC/GCF/TM/test/tServer.h
new file mode 100644
index 00000000000..8df307a4228
--- /dev/null
+++ b/MAC/GCF/TM/test/tServer.h
@@ -0,0 +1,51 @@
+//
+//  tServer.h: Definition of the Echo task class.
+//
+//  Copyright (C) 2009
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+//
+
+#ifndef _TSERVER_H_
+#define _TSERVER_H_
+
+#include <GCF/TM/GCF_Control.h>
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+class tServer : public GCFTask
+{
+public:
+	tServer (string name, uint	startupDelay);
+
+	GCFEvent::TResult initial  (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult connected(GCFEvent& e, GCFPortInterface& p);
+
+private:
+	GCFTCPPort* 	itsListener;
+	GCFTimerPort*	itsTimerPort;
+	uint			itsStartupDelay;
+};
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+#endif
diff --git a/MAC/GCF/TM/test/tStateResult.cc b/MAC/GCF/TM/test/tStateResult.cc
new file mode 100644
index 00000000000..130f311c8f8
--- /dev/null
+++ b/MAC/GCF/TM/test/tStateResult.cc
@@ -0,0 +1,225 @@
+//
+//  tStateResult.cc: Test program to test all kind of usage of the GCF ports.
+//
+//  Copyright (C) 2009
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+
+#include <lofar_config.h>
+#include <Common/LofarLogger.h>
+#include <GCF/TM/GCF_Scheduler.h>
+#include "Echo_Protocol.ph"
+#include "tStateResult.h"
+#include "tServer.h"
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+
+// Constructors of both classes
+tStateResult::tStateResult(string name) : 
+	GCFTask     ((State)&tStateResult::initial, name),
+	itsServer	(0),
+	itsConn 	(0)
+{ 
+	registerProtocol (ECHO_PROTOCOL, ECHO_PROTOCOL_STRINGS);
+}
+
+tStateResult::~tStateResult()
+{
+}
+
+//
+// initial
+//
+// Start a server task that will open the listener after 25 second. Start an autoOpen call
+// in this taks and wait till the connection is established.
+//
+GCFEvent::TResult tStateResult::initial(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tStateResult::initial: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_INIT:
+		return (GCFEvent::HANDLED);
+
+	case F_ENTRY:
+		LOG_DEBUG("\n\n\n\nStarting the server task");
+		tServer*	itsServer = new tServer("Server", 0);
+		itsServer->start();
+		itsConn = new GCFTCPPort(*this, "Echo:Server", GCFPortInterface::SAP, ECHO_PROTOCOL, false);
+		ASSERTSTR(itsConn, "Can't allocate a TCPport");
+		itsConn->autoOpen(10, 0, 2);	// try to connect to my server
+		break;
+
+	case F_CONNECTED:
+		TRAN(tStateResult::collecting);
+		break;
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("HOUSTON HAVE A PROBLEM");
+		break;
+
+	case F_EXIT:
+		LOG_INFO("Deliberately returning F_EXIT as NOT_HANDLED");
+		return (GCFEvent::NOT_HANDLED);
+
+	default:
+		LOG_WARN_STR("DEFAULT in initial: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+//
+// collecting
+//
+// We send some pings to our echo server and accept some of the replies and
+// return the others as NEXT_STATE or NOT_HANDLED.
+//
+GCFEvent::TResult tStateResult::collecting(GCFEvent& event, GCFPortInterface& /*port*/)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tStateResult::collecting: " << eventName(event.signal));
+//	GCFScheduler::instance()->printEventQueue();
+
+	switch (event.signal) {
+	case F_ENTRY: {
+		LOG_DEBUG_STR("Sending ping nr 1");
+		EchoPingEvent	ping;
+		ping.seqnr=1;
+		itsConn->send(ping);
+	}
+	break;
+
+	case ECHO_ECHO: {
+		EchoEchoEvent	echo(event);
+		if (echo.seqnr % 5 == 0) {
+			LOG_DEBUG_STR("Received echo " << echo.seqnr << ", returning NOT_HANDLED");
+			status = GCFEvent::NOT_HANDLED;
+		} 
+		else if (echo.seqnr % 3 == 0) {
+			LOG_DEBUG_STR("Received echo " << echo.seqnr << ", returning NEXT_STATE");
+			status = GCFEvent::NEXT_STATE;
+		}
+		else {
+			LOG_DEBUG_STR("Received echo " << echo.seqnr << ", returning HANDLED");
+			status = GCFEvent::HANDLED;
+		}
+
+		if (echo.seqnr < 10) {
+			EchoPingEvent	ping;
+			ping.seqnr = ++echo.seqnr;
+			LOG_DEBUG_STR("Sending ping nr " << ping.seqnr);
+			itsConn->send(ping);
+		}
+		else {
+			LOG_DEBUG ("Going to the last state, expecting 3 ECHO's from this state");
+			TRAN(tStateResult::lastState);
+		}
+	}
+	break;
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("WE STILL HAVE A PROBLEM");
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in collecting");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in collecting: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	LOG_DEBUG("EOS collecting");
+	return status;
+}
+
+//
+// lastState
+//
+// Start a server task that will open the listener after 25 second. Start an autoOpen call
+// in this taks and wait till the connection is established.
+//
+GCFEvent::TResult tStateResult::lastState(GCFEvent& event, GCFPortInterface& port)
+{
+	GCFEvent::TResult status = GCFEvent::HANDLED;
+	LOG_DEBUG_STR ("tStateResult::lastState: " << eventName(event.signal));
+
+	switch (event.signal) {
+	case F_ENTRY:
+		break;
+
+	case ECHO_ECHO: {
+		EchoEchoEvent	echo(event);
+		LOG_DEBUG_STR("Received postponed ECHO nr " << echo.seqnr);
+		if (echo.seqnr < 9) {
+			return (GCFEvent::HANDLED);
+		}
+		LOG_DEBUG("Program ran succesfully");
+		GCFScheduler::instance()->stop();
+		break;
+	}
+
+	case F_DISCONNECTED:
+		LOG_DEBUG_STR("WE STILL HAVE A PROBLEM");
+		break;
+
+	case F_EXIT:
+		LOG_INFO("F_EXIT event in lastState");
+		break;
+
+	default:
+		LOG_WARN_STR("DEFAULT in lastState: " << eventName(event));
+		status = GCFEvent::NOT_HANDLED;
+		break;
+	}
+
+	return status;
+}
+
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+
+using namespace LOFAR::GCF::TM;
+
+//
+// MAIN()
+//
+int main(int argc, char* argv[])
+{
+	GCFScheduler*	theScheduler(GCFScheduler::instance());
+	theScheduler->init(argc, argv);
+
+	tStateResult	clientTask("clientTask");
+	clientTask.start(); // make initial transition
+
+	theScheduler->run();
+
+	return (0);
+}
diff --git a/MAC/GCF/TM/test/tStateResult.h b/MAC/GCF/TM/test/tStateResult.h
new file mode 100644
index 00000000000..82062f7586c
--- /dev/null
+++ b/MAC/GCF/TM/test/tStateResult.h
@@ -0,0 +1,58 @@
+//
+//  tStateResult.h: Test program to test all kind of usage of the GCF ports.
+//
+//  Copyright (C) 2006
+//  ASTRON (Netherlands Foundation for Research in Astronomy)
+//  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+//  $Id$
+//
+
+#ifndef _TSTATE_RESULT_H_
+#define _TSTATE_RESULT_H_
+
+#include <GCF/TM/GCF_Control.h>
+
+namespace LOFAR {
+ namespace GCF {
+  namespace TM {
+
+//
+// Test if the framework responds in the right way on the return state
+// that is returned by the task states.
+//
+
+class tStateResult : public GCFTask
+{
+public:
+	tStateResult (string name);
+	~tStateResult();
+
+	// The test states
+	GCFEvent::TResult initial 	 (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult collecting (GCFEvent& e, GCFPortInterface& p);
+	GCFEvent::TResult lastState	 (GCFEvent& e, GCFPortInterface& p);
+
+private:
+	GCFTCPPort*		itsServer;
+	GCFTCPPort*		itsConn;
+};
+
+  } // namespace TM
+ } // namespace GCF
+} // namespace LOFAR
+#endif
diff --git a/MAC/GCF/TM/test/tTimer.cc b/MAC/GCF/TM/test/tTimer.cc
index b40b14a4b2d..aef32b12ee2 100644
--- a/MAC/GCF/TM/test/tTimer.cc
+++ b/MAC/GCF/TM/test/tTimer.cc
@@ -112,7 +112,7 @@ GCFEvent::TResult tTimer::test1(GCFEvent& event, GCFPortInterface& /*port*/)
 				LOG_DEBUG_STR("ID = " << timerEvent.id << ", *arg = " << (char*)timerEvent.arg);
 				if (gTest++ > 20) {
 					itsTimerPort->cancelTimer(gTimerID);
-					stop();
+					GCFScheduler::instance()->stop();
 				}
 			}
 			break;
@@ -140,13 +140,13 @@ using namespace LOFAR::GCF::TM;
 //
 int main(int argc, char* argv[])
 {
-	GCFTask::init(argc, argv);
+	GCFScheduler::instance()->init(argc, argv);
 
 	tTimer	timerTask("TimerTask");
 
 	timerTask.start(); // make initial transition
 
-	GCFTask::run();
+	GCFScheduler::instance()->run();
 
 	return (0);
 }
diff --git a/MAC/GCF/TM/test/testTask.cc b/MAC/GCF/TM/test/testTask.cc
index b49a679beeb..654dcd5a4ab 100644
--- a/MAC/GCF/TM/test/testTask.cc
+++ b/MAC/GCF/TM/test/testTask.cc
@@ -25,10 +25,12 @@
 
 //# Includes
 #include <Common/LofarLogger.h>
+#include <GCF/TM/GCF_Protocols.h>
 #include "testTask.h"
 
 namespace LOFAR {
   namespace GCF {
+    namespace TM {
 
 //
 // testTask(name, timerInterval)
@@ -80,7 +82,7 @@ GCFEvent::TResult	testTask::mainTask(GCFEvent&	event, GCFPortInterface&	port)
 			GCFTimerEvent&		timerEvent = static_cast<GCFTimerEvent&>(event);
 			if (timerEvent.id == itsStopTimer) {
 				LOG_INFO("STOPTIMER EXPIRED, CALLING STOP()");
-				stop();
+				GCFScheduler::instance()->stop();
 			}
 		}
 		break;
@@ -114,5 +116,6 @@ GCFEvent::TResult	testTask::mainTask(GCFEvent&	event, GCFPortInterface&	port)
 	return (GCFEvent::HANDLED);
 }
 
+	} // namespace TM
   } // namespace GCF
 } // namespace LOFAR
diff --git a/MAC/GCF/TM/test/testTask.h b/MAC/GCF/TM/test/testTask.h
index 484119a4f1b..e96f56781b2 100644
--- a/MAC/GCF/TM/test/testTask.h
+++ b/MAC/GCF/TM/test/testTask.h
@@ -39,6 +39,7 @@ namespace LOFAR {
   using GCF::TM::GCFTask;
   using GCF::TM::GCFPortInterface;
   namespace GCF {
+	namespace TM {
 
 // \addtogroup GCF
 // @{
@@ -69,6 +70,7 @@ private:
 };
 
 // @}
+    } // namespace TM
   } // namespace GCF
 } // namespace LOFAR
 
diff --git a/MAC/MACIO/include/MACIO/GCF_Event.h b/MAC/MACIO/include/MACIO/GCF_Event.h
index 57d183e8346..05251e7b7cd 100644
--- a/MAC/MACIO/include/MACIO/GCF_Event.h
+++ b/MAC/MACIO/include/MACIO/GCF_Event.h
@@ -71,8 +71,9 @@ public:
 	/// result of a dispatch action
 	enum TResult { 
 		ERROR = -1, 
-		HANDLED = 0, 
-		NOT_HANDLED = 1
+		HANDLED, 
+		NOT_HANDLED,
+		NEXT_STATE
 	};
 
 	// packs all fields of the event into the event buffer and returns its 
@@ -80,7 +81,7 @@ public:
 	virtual void* pack(uint32& packsize);
 
 	// Make a copy of the event
-	GCFEvent* clone();
+	GCFEvent* clone() const;
 
 protected:
 	// special constructor it will be call by the specialised "unpack"- 
diff --git a/MAC/MACIO/src/GCF_Event.cc b/MAC/MACIO/src/GCF_Event.cc
index bd3ada980b0..777570fb697 100644
--- a/MAC/MACIO/src/GCF_Event.cc
+++ b/MAC/MACIO/src/GCF_Event.cc
@@ -61,19 +61,13 @@ void GCFEvent::resizeBuf(uint32 requiredSize)
   length = requiredSize - sizeof(length) - sizeof(signal);
 }
 
-GCFEvent* GCFEvent::clone()
+GCFEvent* GCFEvent::clone() const
 {
 	int		mySize = sizeof(GCFEvent) + length;
 	char* 	theClone = new char[mySize];
 	memcpy(theClone, (const char*)this, mySize);
 
-//	string	hd;
-//	hexdump(hd, this, mySize);
-//	LOG_DEBUG(hd);
-	LOG_DEBUG_STR("The clone is " << mySize << " bytes");
-//	hd.clear();
-//	hexdump(hd, theClone, mySize);
-//	LOG_DEBUG(hd);
+	LOG_TRACE_CALC_STR("The clone is " << mySize << " bytes");
 
 	return ((GCFEvent*) theClone);
 }
-- 
GitLab